// $ANTLR 3.4 PLSQL_DMLParser.g 2011-11-07 21:57:42

package com.polytech.diploma.OracleSQL;


import org.antlr.runtime.*;
import java.util.Stack;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;

import org.antlr.runtime.tree.*;


@SuppressWarnings({"all", "warnings", "unchecked"})
public class PLSQLParser_PLSQL_DMLParser extends Parser {
    public static final int EOF=-1;
    public static final int AMPERSAND=4;
    public static final int APPROXIMATE_NUM_LIT=5;
    public static final int ASSIGN_OP=6;
    public static final int ASTERISK=7;
    public static final int AT_SIGN=8;
    public static final int BIT_STRING_LIT=9;
    public static final int CHAR_STRING=10;
    public static final int COLON=11;
    public static final int COMMA=12;
    public static final int COMMENT=13;
    public static final int CONCATENATION_OP=14;
    public static final int DELIMITED_ID=15;
    public static final int DOUBLE_ASTERISK=16;
    public static final int DOUBLE_PERIOD=17;
    public static final int EQUALS_OP=18;
    public static final int EXACT_NUM_LIT=19;
    public static final int FOR_NOTATION=20;
    public static final int GREATER_THAN_OP=21;
    public static final int GREATER_THAN_OR_EQUALS_OP=22;
    public static final int HEX_STRING_LIT=23;
    public static final int INTRODUCER=24;
    public static final int LEFT_BRACKET=25;
    public static final int LEFT_PAREN=26;
    public static final int LESS_THAN_OP=27;
    public static final int LESS_THAN_OR_EQUALS_OP=28;
    public static final int MINUS_SIGN=29;
    public static final int NATIONAL_CHAR_STRING_LIT=30;
    public static final int NEWLINE=31;
    public static final int NOT_EQUAL_OP=32;
    public static final int PERCENT=33;
    public static final int PERIOD=34;
    public static final int PLSQL_NON_RESERVED_ELSIF=35;
    public static final int PLSQL_NON_RESERVED_MODEL=36;
    public static final int PLSQL_NON_RESERVED_USING=37;
    public static final int PLSQL_RESERVED_CLUSTERS=38;
    public static final int PLSQL_RESERVED_COLAUTH=39;
    public static final int PLSQL_RESERVED_COLUMNS=40;
    public static final int PLSQL_RESERVED_COMPRESS=41;
    public static final int PLSQL_RESERVED_CRASH=42;
    public static final int PLSQL_RESERVED_EXCLUSIVE=43;
    public static final int PLSQL_RESERVED_IDENTIFIED=44;
    public static final int PLSQL_RESERVED_IF=45;
    public static final int PLSQL_RESERVED_INDEX=46;
    public static final int PLSQL_RESERVED_INDEXES=47;
    public static final int PLSQL_RESERVED_LOCK=48;
    public static final int PLSQL_RESERVED_MINUS=49;
    public static final int PLSQL_RESERVED_MODE=50;
    public static final int PLSQL_RESERVED_NOCOMPRESS=51;
    public static final int PLSQL_RESERVED_NOWAIT=52;
    public static final int PLSQL_RESERVED_RESOURCE=53;
    public static final int PLSQL_RESERVED_SHARE=54;
    public static final int PLSQL_RESERVED_START=55;
    public static final int PLSQL_RESERVED_TABAUTH=56;
    public static final int PLSQL_RESERVED_VIEWS=57;
    public static final int PLUS_SIGN=58;
    public static final int QUESTION_MARK=59;
    public static final int REGULAR_ID=60;
    public static final int RIGHT_BRACKET=61;
    public static final int RIGHT_PAREN=62;
    public static final int SEMICOLON=63;
    public static final int SEPARATOR=64;
    public static final int SIMPLE_LETTER=65;
    public static final int SOLIDUS=66;
    public static final int SPACE=67;
    public static final int SQL92_RESERVED_ALL=68;
    public static final int SQL92_RESERVED_ALTER=69;
    public static final int SQL92_RESERVED_AND=70;
    public static final int SQL92_RESERVED_ANY=71;
    public static final int SQL92_RESERVED_AS=72;
    public static final int SQL92_RESERVED_ASC=73;
    public static final int SQL92_RESERVED_AT=74;
    public static final int SQL92_RESERVED_BEGIN=75;
    public static final int SQL92_RESERVED_BETWEEN=76;
    public static final int SQL92_RESERVED_BY=77;
    public static final int SQL92_RESERVED_CASE=78;
    public static final int SQL92_RESERVED_CHECK=79;
    public static final int SQL92_RESERVED_CONNECT=80;
    public static final int SQL92_RESERVED_CREATE=81;
    public static final int SQL92_RESERVED_CURRENT=82;
    public static final int SQL92_RESERVED_DECLARE=83;
    public static final int SQL92_RESERVED_DEFAULT=84;
    public static final int SQL92_RESERVED_DELETE=85;
    public static final int SQL92_RESERVED_DESC=86;
    public static final int SQL92_RESERVED_DISTINCT=87;
    public static final int SQL92_RESERVED_DROP=88;
    public static final int SQL92_RESERVED_ELSE=89;
    public static final int SQL92_RESERVED_END=90;
    public static final int SQL92_RESERVED_EXCEPTION=91;
    public static final int SQL92_RESERVED_EXISTS=92;
    public static final int SQL92_RESERVED_FALSE=93;
    public static final int SQL92_RESERVED_FETCH=94;
    public static final int SQL92_RESERVED_FOR=95;
    public static final int SQL92_RESERVED_FROM=96;
    public static final int SQL92_RESERVED_GOTO=97;
    public static final int SQL92_RESERVED_GRANT=98;
    public static final int SQL92_RESERVED_GROUP=99;
    public static final int SQL92_RESERVED_HAVING=100;
    public static final int SQL92_RESERVED_IN=101;
    public static final int SQL92_RESERVED_INSERT=102;
    public static final int SQL92_RESERVED_INTERSECT=103;
    public static final int SQL92_RESERVED_INTO=104;
    public static final int SQL92_RESERVED_IS=105;
    public static final int SQL92_RESERVED_LIKE=106;
    public static final int SQL92_RESERVED_NOT=107;
    public static final int SQL92_RESERVED_NULL=108;
    public static final int SQL92_RESERVED_OF=109;
    public static final int SQL92_RESERVED_ON=110;
    public static final int SQL92_RESERVED_OPTION=111;
    public static final int SQL92_RESERVED_OR=112;
    public static final int SQL92_RESERVED_ORDER=113;
    public static final int SQL92_RESERVED_OVERLAPS=114;
    public static final int SQL92_RESERVED_PRIOR=115;
    public static final int SQL92_RESERVED_PROCEDURE=116;
    public static final int SQL92_RESERVED_PUBLIC=117;
    public static final int SQL92_RESERVED_REVOKE=118;
    public static final int SQL92_RESERVED_SELECT=119;
    public static final int SQL92_RESERVED_SIZE=120;
    public static final int SQL92_RESERVED_SQL=121;
    public static final int SQL92_RESERVED_TABLE=122;
    public static final int SQL92_RESERVED_THEN=123;
    public static final int SQL92_RESERVED_TO=124;
    public static final int SQL92_RESERVED_TRUE=125;
    public static final int SQL92_RESERVED_UNION=126;
    public static final int SQL92_RESERVED_UNIQUE=127;
    public static final int SQL92_RESERVED_UPDATE=128;
    public static final int SQL92_RESERVED_VALUES=129;
    public static final int SQL92_RESERVED_VIEW=130;
    public static final int SQL92_RESERVED_WHEN=131;
    public static final int SQL92_RESERVED_WHERE=132;
    public static final int SQL92_RESERVED_WITH=133;
    public static final int UNDERSCORE=134;
    public static final int UNSIGNED_INTEGER=135;
    public static final int VERTICAL_BAR=136;
    public static final int ADD_VK=137;
    public static final int AFTER_VK=138;
    public static final int AGENT_VK=139;
    public static final int AGGREGATE_VK=140;
    public static final int ALIAS=141;
    public static final int ANALYZE_VK=142;
    public static final int ANY_ELEMENT=143;
    public static final int ANY_MODE=144;
    public static final int ARGUMENT=146;
    public static final int ARGUMENTS=147;
    public static final int ASSIGN=148;
    public static final int ASSOCIATE_VK=149;
    public static final int ATTRIBUTE_NAME=151;
    public static final int AT_VK=153;
    public static final int AUDIT_VK=154;
    public static final int AUTHID_VK=155;
    public static final int AUTOMATIC_VK=156;
    public static final int AUTONOMOUS_TRANSACTION_VK=157;
    public static final int AUTO_VK=158;
    public static final int BATCH_VK=159;
    public static final int BEFORE_VK=160;
    public static final int BFILE_VK=161;
    public static final int BINARY_DOUBLE_VK=162;
    public static final int BINARY_FLOAT_VK=163;
    public static final int BINARY_INTEGER_VK=164;
    public static final int BIT_VK=165;
    public static final int BLOB_VK=166;
    public static final int BLOCK_VK=167;
    public static final int BODY_VK=168;
    public static final int BOOLEAN_VK=169;
    public static final int BOTH_VK=170;
    public static final int BULK_VK=171;
    public static final int BYTE_VK=172;
    public static final int CACHE_VK=173;
    public static final int CALL_VK=174;
    public static final int CANONICAL_VK=175;
    public static final int CASCADE_VK=176;
    public static final int CASCATED_ELEMENT=177;
    public static final int CAST_VK=178;
    public static final int CHARACTER_VK=179;
    public static final int CHAR_CS_VK=180;
    public static final int CHAR_SET_NAME=181;
    public static final int CHAR_VK=183;
    public static final int CHR_VK=184;
    public static final int CLOB_VK=185;
    public static final int CLOSE_VK=186;
    public static final int CLUSTER_VK=187;
    public static final int COLLECTION_MODE=188;
    public static final int COLLECTION_NAME=189;
    public static final int COLLECT_VK=190;
    public static final int COLUMNS=192;
    public static final int COLUMN_NAME=193;
    public static final int COMMENT_VK=195;
    public static final int COMMITTED_VK=196;
    public static final int COMMIT_VK=197;
    public static final int COMPATIBILITY_VK=198;
    public static final int COMPILE_VK=199;
    public static final int COMPOUND_VK=200;
    public static final int CONDITIONAL_INSERT=202;
    public static final int CONSTANT_VK=203;
    public static final int CONSTRAINT_NAME=204;
    public static final int CONSTRUCTOR_VK=205;
    public static final int CONTENT_VK=206;
    public static final int CONTEXT_VK=207;
    public static final int CONTINUE_VK=208;
    public static final int CONVERT_VK=209;
    public static final int CORRUPT_XID_ALL_VK=210;
    public static final int CORRUPT_XID_VK=211;
    public static final int COST_CLASS_NAME=212;
    public static final int COST_VK=213;
    public static final int COUNT_VK=214;
    public static final int CROSS_VK=215;
    public static final int CUBE_VK=216;
    public static final int CURRENT_USER_VK=217;
    public static final int CURRENT_VK=218;
    public static final int CURSOR_NAME=219;
    public static final int CUSTOMDATUM_VK=220;
    public static final int CUSTOM_TYPE=221;
    public static final int CYCLE_VK=222;
    public static final int C_VK=223;
    public static final int DATABASE_VK=224;
    public static final int DATETIME_OP=225;
    public static final int DATE_VK=226;
    public static final int DAY_VK=227;
    public static final int DBTIMEZONE_VK=228;
    public static final int DB_ROLE_CHANGE_VK=229;
    public static final int DDL_VK=230;
    public static final int DEBUG_VK=231;
    public static final int DECIMAL_VK=232;
    public static final int DECOMPOSE_VK=233;
    public static final int DECREMENT_VK=234;
    public static final int DEC_VK=235;
    public static final int DEFAULTS_VK=236;
    public static final int DEFERRED_VK=237;
    public static final int DEFINER_VK=238;
    public static final int DENSE_RANK_VK=240;
    public static final int DETERMINISTIC_VK=241;
    public static final int DIMENSION_VK=242;
    public static final int DIRECT_MODE=243;
    public static final int DISABLE_VK=244;
    public static final int DISASSOCIATE_VK=245;
    public static final int DML_STATEMENT=246;
    public static final int DOCUMENT_VK=247;
    public static final int DOT_ASTERISK=248;
    public static final int DOUBLE_VK=249;
    public static final int DSINTERVAL_UNCONSTRAINED_VK=250;
    public static final int ELEMENT=251;
    public static final int ELEMENTS_MODE=252;
    public static final int ENABLE_VK=253;
    public static final int ENCODING_VK=254;
    public static final int ENTITYESCAPING_VK=255;
    public static final int EVALNAME_VK=257;
    public static final int EXCEPTIONS_VK=259;
    public static final int EXCEPTION_INIT_VK=260;
    public static final int EXCEPTION_NAME=261;
    public static final int EXCLUDE_VK=262;
    public static final int EXECUTE_VK=263;
    public static final int EXIT_VK=264;
    public static final int EXPR=265;
    public static final int EXPR_LIST=266;
    public static final int EXTERNAL_VK=267;
    public static final int EXTRACT_VK=268;
    public static final int FACTORING=269;
    public static final int FINAL_VK=270;
    public static final int FIRST_VALUE_VK=271;
    public static final int FIRST_VK=272;
    public static final int FLOAT_VK=273;
    public static final int FOLLOWING_VK=274;
    public static final int FOLLOWS_VK=275;
    public static final int FORALL_VK=276;
    public static final int FORCE_VK=277;
    public static final int FOR_MULTI_COLUMN=278;
    public static final int FOR_SINGLE_COLUMN=279;
    public static final int FULL_VK=280;
    public static final int FUNCTION_ENABLING_OVER=281;
    public static final int FUNCTION_ENABLING_USING=282;
    public static final int FUNCTION_ENABLING_WITHIN_OR_OVER=283;
    public static final int FUNCTION_NAME=284;
    public static final int GROUPING_VK=287;
    public static final int GROUPIN_SET=288;
    public static final int GROUP_BY_ELEMENT=289;
    public static final int HASH_VK=290;
    public static final int HIDE_VK=291;
    public static final int HIERARCHICAL=292;
    public static final int HOSTED_VARIABLE=293;
    public static final int HOSTED_VARIABLE_NAME=294;
    public static final int HOSTED_VARIABLE_ROUTINE_CALL=295;
    public static final int HOUR_VK=296;
    public static final int ID=297;
    public static final int IGNORE_VK=298;
    public static final int IMMEDIATE_VK=299;
    public static final int IMPLEMENTATION_TYPE_NAME=300;
    public static final int INCLUDE_VK=301;
    public static final int INCLUDING_VK=302;
    public static final int INCREMENT_VK=303;
    public static final int INDENT_VK=304;
    public static final int INDEX_NAME=305;
    public static final int INLINE_VK=306;
    public static final int INNER_VK=307;
    public static final int INOUT_VK=308;
    public static final int INSTANTIABLE_VK=309;
    public static final int INSTEAD_VK=310;
    public static final int INTEGER_VK=311;
    public static final int INTERVAL_DATATYPE=312;
    public static final int INT_VK=314;
    public static final int INVALIDATE_VK=315;
    public static final int ISOLATION_VK=316;
    public static final int IS_A_SET=317;
    public static final int IS_EMPTY=318;
    public static final int IS_INFINITE=319;
    public static final int IS_NAN=320;
    public static final int IS_NOT_A_SET=321;
    public static final int IS_NOT_EMPTY=322;
    public static final int IS_NOT_INFINITE=323;
    public static final int IS_NOT_NAN=324;
    public static final int IS_NOT_NULL=325;
    public static final int IS_NOT_OF_TYPE=326;
    public static final int IS_NOT_PRESENT=327;
    public static final int IS_NULL=328;
    public static final int IS_OF_TYPE=329;
    public static final int IS_PRESENT=330;
    public static final int ITERATE_VK=331;
    public static final int JAVA_VK=332;
    public static final int JOIN_DEF=333;
    public static final int KEEP_VK=334;
    public static final int LABEL_NAME=335;
    public static final int LANGUAGE_VK=336;
    public static final int LAST_VALUE_VK=337;
    public static final int LAST_VK=338;
    public static final int LEADING_VK=339;
    public static final int LEFT_VK=342;
    public static final int LIBRARY_VK=345;
    public static final int LIKE2_VK=346;
    public static final int LIKE4_VK=347;
    public static final int LIKEC_VK=348;
    public static final int LIMIT_VK=349;
    public static final int LINK_NAME=350;
    public static final int LOCAL_VK=351;
    public static final int LOCK_TABLE_ELEMENT=352;
    public static final int LOGIC_EXPR=353;
    public static final int LOGOFF_VK=354;
    public static final int LOGON_VK=355;
    public static final int LOG_VK=356;
    public static final int LONG_VK=357;
    public static final int LOOP_VK=358;
    public static final int MAIN_MODEL=359;
    public static final int MAIN_MODEL_NAME=360;
    public static final int MAP_VK=361;
    public static final int MAXVALUE_VK=362;
    public static final int MEASURES_VK=363;
    public static final int MEMBER_VK=364;
    public static final int MERGE_INSERT=365;
    public static final int MERGE_UPDATE=366;
    public static final int MERGE_VK=367;
    public static final int MINUTE_VK=369;
    public static final int MINVALUE_VK=370;
    public static final int MLSLABEL_VK=371;
    public static final int MODEL_COLUMN=372;
    public static final int MODEL_COLUMNS=373;
    public static final int MODEL_EXPRESSION=374;
    public static final int MODEL_RULE=375;
    public static final int MODEL_RULES=376;
    public static final int MODIFY_VK=377;
    public static final int MONTH_VK=378;
    public static final int MULTI_TABLE_MODE=379;
    public static final int NAME_VK=380;
    public static final int NATIVE_DATATYPE=381;
    public static final int NATURALN_VK=382;
    public static final int NATURAL_VK=383;
    public static final int NAV_VK=384;
    public static final int NCHAR_CS_VK=385;
    public static final int NCHAR_VK=386;
    public static final int NCLOB_VK=387;
    public static final int NESTED_VK=388;
    public static final int NEW_VK=389;
    public static final int NOAUDIT_VK=390;
    public static final int NOCACHE_VK=391;
    public static final int NOCOPY_VK=392;
    public static final int NOCYCLE_VK=393;
    public static final int NOENTITYESCAPING_VK=394;
    public static final int NOMAXVALUE_VK=395;
    public static final int NOMINVALUE_VK=396;
    public static final int NOORDER_VK=397;
    public static final int NOSCHEMACHECK_VK=398;
    public static final int NOT_BETWEEN=399;
    public static final int NOT_IN=401;
    public static final int NOT_LIKE=402;
    public static final int NO_VK=403;
    public static final int NULLS_VK=404;
    public static final int NUMBER_VK=405;
    public static final int NUMERIC_VK=406;
    public static final int NVARCHAR2_VK=407;
    public static final int OBJECT_VK=408;
    public static final int OFF_VK=409;
    public static final int OLD_VK=410;
    public static final int ONLY_VK=411;
    public static final int OPEN_VK=412;
    public static final int ORADATA_VK=413;
    public static final int ORDER_BY_ELEMENT=414;
    public static final int ORDER_BY_ELEMENTS=415;
    public static final int ORDINALITY_VK=416;
    public static final int OUT_VK=417;
    public static final int OVERRIDING_VK=418;
    public static final int OVER_VK=419;
    public static final int PACKAGE_NAME=420;
    public static final int PACKAGE_VK=421;
    public static final int PARALLEL_ENABLE_VK=422;
    public static final int PARAMETERS_VK=423;
    public static final int PARAMETER_NAME=424;
    public static final int PARENT_VK=425;
    public static final int PARTITION_VK=426;
    public static final int PASSING_VK=427;
    public static final int PERCENT_FOUND_VK=429;
    public static final int PERCENT_ISOPEN_VK=430;
    public static final int PERCENT_NOTFOUND_VK=431;
    public static final int PERCENT_ROWCOUNT_VK=432;
    public static final int PERCENT_ROWTYPE_VK=433;
    public static final int PERCENT_TYPE_VK=434;
    public static final int PIPELINED_VK=436;
    public static final int PIVOT_ALIAS=437;
    public static final int PIVOT_ELEMENT=438;
    public static final int PIVOT_IN_ELEMENT=439;
    public static final int PIVOT_VK=440;
    public static final int PLS_INTEGER_VK=455;
    public static final int POSITIVEN_VK=457;
    public static final int POSITIVE_VK=458;
    public static final int PRAGMA_VK=459;
    public static final int PRECEDING_VK=460;
    public static final int PRECISION=461;
    public static final int PRECISION_VK=462;
    public static final int PREDICTION_FUNCTION=463;
    public static final int PROCEDURE_NAME=464;
    public static final int QUERY_NAME=465;
    public static final int RAISE_VK=466;
    public static final int RANGE_VK=467;
    public static final int RAW_VK=468;
    public static final int READ_VK=469;
    public static final int REAL_VK=470;
    public static final int RECORD_NAME=471;
    public static final int REFERENCE_MODEL_NAME=472;
    public static final int REFERENCE_VK=473;
    public static final int REFERENCING_VK=474;
    public static final int REF_VK=475;
    public static final int REJECT_VK=477;
    public static final int RELIES_ON_VK=478;
    public static final int RENAME_VK=479;
    public static final int REPLACE_VK=480;
    public static final int RESTRICT_REFERENCES_VK=481;
    public static final int RESULT_CACHE_VK=482;
    public static final int RETURN_VK=483;
    public static final int REUSE_VK=484;
    public static final int REVERSE_VK=485;
    public static final int RIGHT_VK=488;
    public static final int ROLLBACK_SEGMENT_NAME=489;
    public static final int ROLLBACK_VK=490;
    public static final int ROLLUP_VK=491;
    public static final int ROUTINE_CALL=492;
    public static final int ROUTINE_NAME=493;
    public static final int ROWID_VK=494;
    public static final int ROWS_VK=495;
    public static final int ROW_VK=496;
    public static final int RULES_VK=497;
    public static final int SAMPLE_VK=498;
    public static final int SAVEPOINT_NAME=499;
    public static final int SAVEPOINT_VK=500;
    public static final int SCHEMACHECK_VK=501;
    public static final int SCHEMA_NAME=502;
    public static final int SCHEMA_VK=503;
    public static final int SCN_VK=504;
    public static final int SEARCHED_CASE=505;
    public static final int SECOND_VK=506;
    public static final int SEED_VK=507;
    public static final int SELECTED_TABLEVIEW=508;
    public static final int SELECT_ITEM=509;
    public static final int SELECT_LIST=510;
    public static final int SELECT_MODE=511;
    public static final int SELECT_STATEMENT=512;
    public static final int SELF_VK=513;
    public static final int SEQUENCE_NAME=514;
    public static final int SEQUENCE_VK=515;
    public static final int SEQUENTIAL_VK=516;
    public static final int SERIALIZABLE_VK=517;
    public static final int SERIALLY_REUSABLE_VK=518;
    public static final int SERVERERROR_VK=519;
    public static final int SESSIONTIMEZONE_VK=520;
    public static final int SET_VK=521;
    public static final int SHOW_VK=522;
    public static final int SHUTDOWN_VK=523;
    public static final int SIBLINGS_VK=524;
    public static final int SIGNTYPE_VK=525;
    public static final int SIMPLE_CASE=526;
    public static final int SIMPLE_INTEGER_VK=527;
    public static final int SINGLE_TABLE_MODE=528;
    public static final int SINGLE_VK=529;
    public static final int SKIP_VK=530;
    public static final int SMALLINT_VK=531;
    public static final int SOME_VK=533;
    public static final int SPECIFICATION_VK=534;
    public static final int SQLDATA_VK=596;
    public static final int STANDALONE_VK=597;
    public static final int STANDARD_FUNCTION=598;
    public static final int STARTUP_VK=599;
    public static final int STATIC_RETURNING=600;
    public static final int STATIC_VK=601;
    public static final int STATISTICS_VK=602;
    public static final int STRING_VK=603;
    public static final int SUBMULTISET_VK=604;
    public static final int SUBPARTITION_VK=605;
    public static final int SUBQUERY=606;
    public static final int SUSPEND_VK=607;
    public static final int TABLEVIEW_NAME=608;
    public static final int TABLE_ELEMENT=609;
    public static final int TABLE_EXPRESSION=610;
    public static final int TABLE_REF=611;
    public static final int TABLE_REF_ELEMENT=612;
    public static final int TABLE_VAR_NAME=613;
    public static final int TIMESTAMP_LTZ_UNCONSTRAINED_VK=614;
    public static final int TIMESTAMP_TZ_UNCONSTRAINED_VK=615;
    public static final int TIMESTAMP_UNCONSTRAINED_VK=616;
    public static final int TIMESTAMP_VK=617;
    public static final int TIMEZONE_ABBR_VK=618;
    public static final int TIMEZONE_HOUR_VK=619;
    public static final int TIMEZONE_MINUTE_VK=620;
    public static final int TIMEZONE_REGION_VK=621;
    public static final int TIME_VK=622;
    public static final int TRAILING_VK=623;
    public static final int TRANSLATE_VK=624;
    public static final int TREAT_VK=625;
    public static final int TRIGGER_NAME=626;
    public static final int TRIM_VK=627;
    public static final int TRUNCATE_VK=628;
    public static final int TYPE_NAME=629;
    public static final int TYPE_VK=630;
    public static final int UNARY_OPERATOR=631;
    public static final int UNBOUNDED_VK=632;
    public static final int UNDER_VK=633;
    public static final int UNLIMITED_VK=634;
    public static final int UNPIVOT_IN_ELEMENT=635;
    public static final int UNPIVOT_VK=636;
    public static final int UNTIL_VK=638;
    public static final int UPDATED_VK=639;
    public static final int UPSERT_VK=640;
    public static final int UROWID_VK=641;
    public static final int VALIDATE_VK=642;
    public static final int VALUE_VK=643;
    public static final int VARCHAR2_VK=644;
    public static final int VARCHAR_VK=645;
    public static final int VARIABLE_NAME=646;
    public static final int VECTOR_EXPR=647;
    public static final int VERSIONS_VK=648;
    public static final int VERSION_VK=649;
    public static final int WAIT_VK=650;
    public static final int WELLFORMED_VK=651;
    public static final int WITHIN_VK=652;
    public static final int WORK_VK=653;
    public static final int WRITE_VK=654;
    public static final int XMLAGG_VK=655;
    public static final int XMLATTRIBUTES_VK=656;
    public static final int XMLCAST_VK=657;
    public static final int XMLCOLATTVAL_VK=658;
    public static final int XMLELEMENT_VK=659;
    public static final int XMLEXISTS_VK=660;
    public static final int XMLFOREST_VK=661;
    public static final int XMLNAMESPACES_VK=662;
    public static final int XMLPARSE_VK=663;
    public static final int XMLPI_VK=664;
    public static final int XMLQUERY_VK=665;
    public static final int XMLROOT_VK=666;
    public static final int XMLSERIALIZE_VK=667;
    public static final int XMLTABLE_VK=668;
    public static final int XML_ALIAS=669;
    public static final int XML_COLUMN=670;
    public static final int XML_COLUMN_NAME=671;
    public static final int XML_ELEMENT=672;
    public static final int XML_VK=673;
    public static final int YEAR_VK=674;
    public static final int YES_VK=675;
    public static final int YMINTERVAL_UNCONSTRAINED_VK=676;

    // delegates
    public Parser[] getDelegates() {
        return new Parser[] {};
    }

    // delegators
    public PLSQLParser gPLSQLParser;
    public PLSQLParser gParent;


    public PLSQLParser_PLSQL_DMLParser(TokenStream input, PLSQLParser gPLSQLParser) {
        this(input, new RecognizerSharedState(), gPLSQLParser);
    }
    public PLSQLParser_PLSQL_DMLParser(TokenStream input, RecognizerSharedState state, PLSQLParser gPLSQLParser) {
        super(input, state);
        this.gPLSQLParser = gPLSQLParser;
        gParent = gPLSQLParser;
    }

protected TreeAdaptor adaptor = new CommonTreeAdaptor();

public void setTreeAdaptor(TreeAdaptor adaptor) {
    this.adaptor = adaptor;
}
public TreeAdaptor getTreeAdaptor() {
    return adaptor;
}
    public String[] getTokenNames() { return PLSQLParser.tokenNames; }
    public String getGrammarFileName() { return "PLSQL_DMLParser.g"; }


        private boolean isTableAlias() {
            String lt1 = input.LT(1).getText().toLowerCase();
            String lt2 = "";
            if (input.LT(2).getText() != null){
                lt2 = input.LT(2).getText().toLowerCase();
            }

            if (lt1.equals("as")){
                return true;
            }

            if ((lt1.equals("partition") && lt2.equals("by")) || lt1.equals("cross")
                    || lt1.equals("natural") || lt1.equals("inner")
                    || lt1.equals("join")
                    || ((lt1.equals("full") || lt1.equals("left") || lt1.equals("right")) && (lt2.equals("outer") || lt2.equals("join")))) {
                return false;
            }
            return true;
        }

        private boolean isStandardPredictionFunction(String originalFunctionName) {
            String functionName = originalFunctionName.toLowerCase();
            if (functionName.equals("prediction")
                    || functionName.equals("prediction_bounds")
                    || functionName.equals("prediction_cost")
                    || functionName.equals("prediction_details")
                    || functionName.equals("prediction_probability")
                    || functionName.equals("prediction_set")) {
                return true;
            }
            return false;
        }

        private boolean enablesWithinOrOverClause(String originalFunctionName) {
            String functionName = originalFunctionName.toLowerCase();
            if (functionName.equals("cume_dist")
                    || functionName.equals("dense_rank")
                    || functionName.equals("percent_rank")
                    || functionName.equals("percentile_cont")
                    || functionName.equals("percentile_disc")
                    || functionName.equals("rank")) {
                return true;
            }
            return false;
        }

        private boolean enablesUsingClause(String originalFunctionName) {
            String functionName = originalFunctionName.toLowerCase();
            if (functionName.startsWith("cluster_")
                    || functionName.startsWith("feature_")) {
                return true;
            }
            return false;
        }

        private boolean enablesOverClause(String originalFunctionName) {
            String functionName = originalFunctionName.toLowerCase();
            if (functionName.equals("avg") || functionName.equals("corr")
                    || functionName.equals("lag") || functionName.equals("lead")
                    || functionName.equals("max") || functionName.equals("median")
                    || functionName.equals("min") || functionName.equals("ntile")
                    || functionName.equals("ratio_to_report")
                    || functionName.equals("row_number")
                    || functionName.equals("sum")
                    || functionName.equals("variance")
                    || functionName.startsWith("regr_")
                    || functionName.startsWith("stddev")
                    || functionName.startsWith("var_")
                    || functionName.startsWith("covar_")) {
                return true;
            }
            return false;
        }


    public static class compilation_unit_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "compilation_unit"
    // PLSQL_DMLParser.g:164:1: compilation_unit : ( seq_of_statements )* EOF ;
    public final PLSQLParser_PLSQL_DMLParser.compilation_unit_return compilation_unit() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.compilation_unit_return retval = new PLSQLParser_PLSQL_DMLParser.compilation_unit_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token EOF2=null;
        PLSQLParser_PLSQL_DMLParser.seq_of_statements_return seq_of_statements1 =null;


        Object EOF2_tree=null;

        try {
            // PLSQL_DMLParser.g:165:5: ( ( seq_of_statements )* EOF )
            // PLSQL_DMLParser.g:165:11: ( seq_of_statements )* EOF
            {
            root_0 = (Object)adaptor.nil();


            // PLSQL_DMLParser.g:165:11: ( seq_of_statements )*
            loop1:
            do {
                int alt1=2;
                int LA1_0 = input.LA(1);

                if ( (LA1_0==DELIMITED_ID||LA1_0==LEFT_PAREN||LA1_0==PLSQL_RESERVED_LOCK||LA1_0==REGULAR_ID||LA1_0==SQL92_RESERVED_CASE||LA1_0==SQL92_RESERVED_DELETE||LA1_0==SQL92_RESERVED_INSERT||LA1_0==SQL92_RESERVED_SELECT||LA1_0==SQL92_RESERVED_UPDATE||LA1_0==SQL92_RESERVED_WITH) ) {
                    alt1=1;
                }


                switch (alt1) {
            	case 1 :
            	    // PLSQL_DMLParser.g:165:11: seq_of_statements
            	    {
            	    pushFollow(FOLLOW_seq_of_statements_in_compilation_unit578);
            	    seq_of_statements1=seq_of_statements();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, seq_of_statements1.getTree());

            	    }
            	    break;

            	default :
            	    break loop1;
                }
            } while (true);


            EOF2=(Token)match(input,EOF,FOLLOW_EOF_in_compilation_unit581); if (state.failed) return retval;
            if ( state.backtracking==0 ) {
            EOF2_tree = 
            (Object)adaptor.create(EOF2)
            ;
            adaptor.addChild(root_0, EOF2_tree);
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "compilation_unit"


    public static class seq_of_statements_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "seq_of_statements"
    // PLSQL_DMLParser.g:169:1: seq_of_statements : ( select_statement | update_statement | delete_statement | insert_statement | lock_table_statement | merge_statement | case_statement[true] );
    public final PLSQLParser_PLSQL_DMLParser.seq_of_statements_return seq_of_statements() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.seq_of_statements_return retval = new PLSQLParser_PLSQL_DMLParser.seq_of_statements_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.select_statement_return select_statement3 =null;

        PLSQLParser_PLSQL_DMLParser.update_statement_return update_statement4 =null;

        PLSQLParser_PLSQL_DMLParser.delete_statement_return delete_statement5 =null;

        PLSQLParser_PLSQL_DMLParser.insert_statement_return insert_statement6 =null;

        PLSQLParser_PLSQL_DMLParser.lock_table_statement_return lock_table_statement7 =null;

        PLSQLParser_PLSQL_DMLParser.merge_statement_return merge_statement8 =null;

        PLSQLParser_PLSQL_DMLParser.case_statement_return case_statement9 =null;



        try {
            // PLSQL_DMLParser.g:170:5: ( select_statement | update_statement | delete_statement | insert_statement | lock_table_statement | merge_statement | case_statement[true] )
            int alt2=7;
            switch ( input.LA(1) ) {
            case LEFT_PAREN:
            case SQL92_RESERVED_SELECT:
            case SQL92_RESERVED_WITH:
                {
                alt2=1;
                }
                break;
            case SQL92_RESERVED_UPDATE:
                {
                alt2=2;
                }
                break;
            case SQL92_RESERVED_DELETE:
                {
                alt2=3;
                }
                break;
            case SQL92_RESERVED_INSERT:
                {
                alt2=4;
                }
                break;
            case PLSQL_RESERVED_LOCK:
                {
                alt2=5;
                }
                break;
            case REGULAR_ID:
                {
                int LA2_6 = input.LA(2);

                if ( (LA2_6==SQL92_RESERVED_INTO) && ((input.LT(1).getText().equalsIgnoreCase("merge")))) {
                    alt2=6;
                }
                else if ( (LA2_6==SQL92_RESERVED_CASE) ) {
                    alt2=7;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 2, 6, input);

                    throw nvae;

                }
                }
                break;
            case DELIMITED_ID:
            case SQL92_RESERVED_CASE:
                {
                alt2=7;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 2, 0, input);

                throw nvae;

            }

            switch (alt2) {
                case 1 :
                    // PLSQL_DMLParser.g:170:10: select_statement
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_select_statement_in_seq_of_statements602);
                    select_statement3=select_statement();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, select_statement3.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:171:10: update_statement
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_update_statement_in_seq_of_statements613);
                    update_statement4=update_statement();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, update_statement4.getTree());

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:172:10: delete_statement
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_delete_statement_in_seq_of_statements624);
                    delete_statement5=delete_statement();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, delete_statement5.getTree());

                    }
                    break;
                case 4 :
                    // PLSQL_DMLParser.g:173:10: insert_statement
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_insert_statement_in_seq_of_statements635);
                    insert_statement6=insert_statement();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, insert_statement6.getTree());

                    }
                    break;
                case 5 :
                    // PLSQL_DMLParser.g:174:10: lock_table_statement
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_lock_table_statement_in_seq_of_statements646);
                    lock_table_statement7=lock_table_statement();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, lock_table_statement7.getTree());

                    }
                    break;
                case 6 :
                    // PLSQL_DMLParser.g:175:10: merge_statement
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_merge_statement_in_seq_of_statements657);
                    merge_statement8=merge_statement();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, merge_statement8.getTree());

                    }
                    break;
                case 7 :
                    // PLSQL_DMLParser.g:176:10: case_statement[true]
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_case_statement_in_seq_of_statements668);
                    case_statement9=case_statement(true);

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, case_statement9.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "seq_of_statements"


    public static class select_statement_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "select_statement"
    // PLSQL_DMLParser.g:179:1: select_statement : ( subquery_factoring_clause )? subquery ( for_update_clause | ( order_key ( siblings_key )? by_key )=> order_by_clause )* -> ^( SELECT_STATEMENT ( subquery_factoring_clause )? subquery ( for_update_clause )* ( order_by_clause )* ) ;
    public final PLSQLParser_PLSQL_DMLParser.select_statement_return select_statement() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.select_statement_return retval = new PLSQLParser_PLSQL_DMLParser.select_statement_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.subquery_factoring_clause_return subquery_factoring_clause10 =null;

        PLSQLParser_PLSQL_DMLParser.subquery_return subquery11 =null;

        PLSQLParser_PLSQL_DMLParser.for_update_clause_return for_update_clause12 =null;

        PLSQLParser_PLSQL_DMLParser.order_by_clause_return order_by_clause13 =null;


        RewriteRuleSubtreeStream stream_subquery_factoring_clause=new RewriteRuleSubtreeStream(adaptor,"rule subquery_factoring_clause");
        RewriteRuleSubtreeStream stream_order_by_clause=new RewriteRuleSubtreeStream(adaptor,"rule order_by_clause");
        RewriteRuleSubtreeStream stream_for_update_clause=new RewriteRuleSubtreeStream(adaptor,"rule for_update_clause");
        RewriteRuleSubtreeStream stream_subquery=new RewriteRuleSubtreeStream(adaptor,"rule subquery");
        try {
            // PLSQL_DMLParser.g:180:5: ( ( subquery_factoring_clause )? subquery ( for_update_clause | ( order_key ( siblings_key )? by_key )=> order_by_clause )* -> ^( SELECT_STATEMENT ( subquery_factoring_clause )? subquery ( for_update_clause )* ( order_by_clause )* ) )
            // PLSQL_DMLParser.g:180:10: ( subquery_factoring_clause )? subquery ( for_update_clause | ( order_key ( siblings_key )? by_key )=> order_by_clause )*
            {
            // PLSQL_DMLParser.g:180:10: ( subquery_factoring_clause )?
            int alt3=2;
            int LA3_0 = input.LA(1);

            if ( (LA3_0==SQL92_RESERVED_WITH) ) {
                alt3=1;
            }
            switch (alt3) {
                case 1 :
                    // PLSQL_DMLParser.g:180:10: subquery_factoring_clause
                    {
                    pushFollow(FOLLOW_subquery_factoring_clause_in_select_statement689);
                    subquery_factoring_clause10=subquery_factoring_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_subquery_factoring_clause.add(subquery_factoring_clause10.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_subquery_in_select_statement700);
            subquery11=subquery();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_subquery.add(subquery11.getTree());

            // PLSQL_DMLParser.g:182:9: ( for_update_clause | ( order_key ( siblings_key )? by_key )=> order_by_clause )*
            loop4:
            do {
                int alt4=3;
                int LA4_0 = input.LA(1);

                if ( (LA4_0==SQL92_RESERVED_FOR) ) {
                    alt4=1;
                }
                else if ( (LA4_0==SQL92_RESERVED_ORDER) && (synpred1_PLSQL_DMLParser())) {
                    alt4=2;
                }


                switch (alt4) {
            	case 1 :
            	    // PLSQL_DMLParser.g:182:10: for_update_clause
            	    {
            	    pushFollow(FOLLOW_for_update_clause_in_select_statement711);
            	    for_update_clause12=for_update_clause();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_for_update_clause.add(for_update_clause12.getTree());

            	    }
            	    break;
            	case 2 :
            	    // PLSQL_DMLParser.g:182:28: ( order_key ( siblings_key )? by_key )=> order_by_clause
            	    {
            	    pushFollow(FOLLOW_order_by_clause_in_select_statement723);
            	    order_by_clause13=order_by_clause();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_order_by_clause.add(order_by_clause13.getTree());

            	    }
            	    break;

            	default :
            	    break loop4;
                }
            } while (true);


            // AST REWRITE
            // elements: subquery, for_update_clause, order_by_clause, subquery_factoring_clause
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 183:9: -> ^( SELECT_STATEMENT ( subquery_factoring_clause )? subquery ( for_update_clause )* ( order_by_clause )* )
            {
                // PLSQL_DMLParser.g:183:12: ^( SELECT_STATEMENT ( subquery_factoring_clause )? subquery ( for_update_clause )* ( order_by_clause )* )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(SELECT_STATEMENT, "SELECT_STATEMENT")
                , root_1);

                // PLSQL_DMLParser.g:183:31: ( subquery_factoring_clause )?
                if ( stream_subquery_factoring_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_subquery_factoring_clause.nextTree());

                }
                stream_subquery_factoring_clause.reset();

                adaptor.addChild(root_1, stream_subquery.nextTree());

                // PLSQL_DMLParser.g:183:67: ( for_update_clause )*
                while ( stream_for_update_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_for_update_clause.nextTree());

                }
                stream_for_update_clause.reset();

                // PLSQL_DMLParser.g:183:86: ( order_by_clause )*
                while ( stream_order_by_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_order_by_clause.nextTree());

                }
                stream_order_by_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "select_statement"


    public static class subquery_factoring_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "subquery_factoring_clause"
    // PLSQL_DMLParser.g:187:1: subquery_factoring_clause : with_key ^ factoring_element ( COMMA ! factoring_element )* ;
    public final PLSQLParser_PLSQL_DMLParser.subquery_factoring_clause_return subquery_factoring_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.subquery_factoring_clause_return retval = new PLSQLParser_PLSQL_DMLParser.subquery_factoring_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COMMA16=null;
        PLSQLParser_PLSQLKeys.with_key_return with_key14 =null;

        PLSQLParser_PLSQL_DMLParser.factoring_element_return factoring_element15 =null;

        PLSQLParser_PLSQL_DMLParser.factoring_element_return factoring_element17 =null;


        Object COMMA16_tree=null;

        try {
            // PLSQL_DMLParser.g:188:5: ( with_key ^ factoring_element ( COMMA ! factoring_element )* )
            // PLSQL_DMLParser.g:188:10: with_key ^ factoring_element ( COMMA ! factoring_element )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_with_key_in_subquery_factoring_clause773);
            with_key14=gPLSQLParser.with_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(with_key14.getTree(), root_0);

            pushFollow(FOLLOW_factoring_element_in_subquery_factoring_clause776);
            factoring_element15=factoring_element();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, factoring_element15.getTree());

            // PLSQL_DMLParser.g:188:38: ( COMMA ! factoring_element )*
            loop5:
            do {
                int alt5=2;
                int LA5_0 = input.LA(1);

                if ( (LA5_0==COMMA) ) {
                    alt5=1;
                }


                switch (alt5) {
            	case 1 :
            	    // PLSQL_DMLParser.g:188:39: COMMA ! factoring_element
            	    {
            	    COMMA16=(Token)match(input,COMMA,FOLLOW_COMMA_in_subquery_factoring_clause779); if (state.failed) return retval;

            	    pushFollow(FOLLOW_factoring_element_in_subquery_factoring_clause782);
            	    factoring_element17=factoring_element();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, factoring_element17.getTree());

            	    }
            	    break;

            	default :
            	    break loop5;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "subquery_factoring_clause"


    public static class factoring_element_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "factoring_element"
    // PLSQL_DMLParser.g:191:1: factoring_element : query_name as_key LEFT_PAREN subquery RIGHT_PAREN -> ^( FACTORING query_name subquery ) ;
    public final PLSQLParser_PLSQL_DMLParser.factoring_element_return factoring_element() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.factoring_element_return retval = new PLSQLParser_PLSQL_DMLParser.factoring_element_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN20=null;
        Token RIGHT_PAREN22=null;
        PLSQLParser_PLSQLCommons.query_name_return query_name18 =null;

        PLSQLParser_PLSQLKeys.as_key_return as_key19 =null;

        PLSQLParser_PLSQL_DMLParser.subquery_return subquery21 =null;


        Object LEFT_PAREN20_tree=null;
        Object RIGHT_PAREN22_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleSubtreeStream stream_as_key=new RewriteRuleSubtreeStream(adaptor,"rule as_key");
        RewriteRuleSubtreeStream stream_query_name=new RewriteRuleSubtreeStream(adaptor,"rule query_name");
        RewriteRuleSubtreeStream stream_subquery=new RewriteRuleSubtreeStream(adaptor,"rule subquery");
        try {
            // PLSQL_DMLParser.g:192:5: ( query_name as_key LEFT_PAREN subquery RIGHT_PAREN -> ^( FACTORING query_name subquery ) )
            // PLSQL_DMLParser.g:192:10: query_name as_key LEFT_PAREN subquery RIGHT_PAREN
            {
            pushFollow(FOLLOW_query_name_in_factoring_element804);
            query_name18=gPLSQLParser.query_name();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_query_name.add(query_name18.getTree());

            pushFollow(FOLLOW_as_key_in_factoring_element806);
            as_key19=gPLSQLParser.as_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_as_key.add(as_key19.getTree());

            LEFT_PAREN20=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_factoring_element808); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN20);


            pushFollow(FOLLOW_subquery_in_factoring_element810);
            subquery21=subquery();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_subquery.add(subquery21.getTree());

            RIGHT_PAREN22=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_factoring_element812); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN22);


            // AST REWRITE
            // elements: subquery, query_name
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 193:9: -> ^( FACTORING query_name subquery )
            {
                // PLSQL_DMLParser.g:193:12: ^( FACTORING query_name subquery )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(FACTORING, "FACTORING")
                , root_1);

                adaptor.addChild(root_1, stream_query_name.nextTree());

                adaptor.addChild(root_1, stream_subquery.nextTree());

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "factoring_element"


    public static class subquery_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "subquery"
    // PLSQL_DMLParser.g:196:1: subquery : subquery_basic_elements ( subquery_operation_part )* -> ^( SUBQUERY subquery_basic_elements ( subquery_operation_part )* ) ;
    public final PLSQLParser_PLSQL_DMLParser.subquery_return subquery() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.subquery_return retval = new PLSQLParser_PLSQL_DMLParser.subquery_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.subquery_basic_elements_return subquery_basic_elements23 =null;

        PLSQLParser_PLSQL_DMLParser.subquery_operation_part_return subquery_operation_part24 =null;


        RewriteRuleSubtreeStream stream_subquery_operation_part=new RewriteRuleSubtreeStream(adaptor,"rule subquery_operation_part");
        RewriteRuleSubtreeStream stream_subquery_basic_elements=new RewriteRuleSubtreeStream(adaptor,"rule subquery_basic_elements");
        try {
            // PLSQL_DMLParser.g:197:5: ( subquery_basic_elements ( subquery_operation_part )* -> ^( SUBQUERY subquery_basic_elements ( subquery_operation_part )* ) )
            // PLSQL_DMLParser.g:197:10: subquery_basic_elements ( subquery_operation_part )*
            {
            pushFollow(FOLLOW_subquery_basic_elements_in_subquery850);
            subquery_basic_elements23=subquery_basic_elements();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_subquery_basic_elements.add(subquery_basic_elements23.getTree());

            // PLSQL_DMLParser.g:197:34: ( subquery_operation_part )*
            loop6:
            do {
                int alt6=2;
                int LA6_0 = input.LA(1);

                if ( (LA6_0==PLSQL_RESERVED_MINUS||LA6_0==SQL92_RESERVED_INTERSECT||LA6_0==SQL92_RESERVED_UNION) ) {
                    alt6=1;
                }


                switch (alt6) {
            	case 1 :
            	    // PLSQL_DMLParser.g:197:34: subquery_operation_part
            	    {
            	    pushFollow(FOLLOW_subquery_operation_part_in_subquery852);
            	    subquery_operation_part24=subquery_operation_part();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_subquery_operation_part.add(subquery_operation_part24.getTree());

            	    }
            	    break;

            	default :
            	    break loop6;
                }
            } while (true);


            // AST REWRITE
            // elements: subquery_basic_elements, subquery_operation_part
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 198:9: -> ^( SUBQUERY subquery_basic_elements ( subquery_operation_part )* )
            {
                // PLSQL_DMLParser.g:198:12: ^( SUBQUERY subquery_basic_elements ( subquery_operation_part )* )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(SUBQUERY, "SUBQUERY")
                , root_1);

                adaptor.addChild(root_1, stream_subquery_basic_elements.nextTree());

                // PLSQL_DMLParser.g:198:47: ( subquery_operation_part )*
                while ( stream_subquery_operation_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_subquery_operation_part.nextTree());

                }
                stream_subquery_operation_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "subquery"


    public static class subquery_operation_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "subquery_operation_part"
    // PLSQL_DMLParser.g:201:1: subquery_operation_part : ( union_key ^ ( all_key )? | intersect_key ^| minus_key ^) subquery_basic_elements ;
    public final PLSQLParser_PLSQL_DMLParser.subquery_operation_part_return subquery_operation_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.subquery_operation_part_return retval = new PLSQLParser_PLSQL_DMLParser.subquery_operation_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.union_key_return union_key25 =null;

        PLSQLParser_PLSQLKeys.all_key_return all_key26 =null;

        PLSQLParser_PLSQLKeys.intersect_key_return intersect_key27 =null;

        PLSQLParser_PLSQLKeys.minus_key_return minus_key28 =null;

        PLSQLParser_PLSQL_DMLParser.subquery_basic_elements_return subquery_basic_elements29 =null;



        try {
            // PLSQL_DMLParser.g:202:5: ( ( union_key ^ ( all_key )? | intersect_key ^| minus_key ^) subquery_basic_elements )
            // PLSQL_DMLParser.g:202:10: ( union_key ^ ( all_key )? | intersect_key ^| minus_key ^) subquery_basic_elements
            {
            root_0 = (Object)adaptor.nil();


            // PLSQL_DMLParser.g:202:10: ( union_key ^ ( all_key )? | intersect_key ^| minus_key ^)
            int alt8=3;
            switch ( input.LA(1) ) {
            case SQL92_RESERVED_UNION:
                {
                alt8=1;
                }
                break;
            case SQL92_RESERVED_INTERSECT:
                {
                alt8=2;
                }
                break;
            case PLSQL_RESERVED_MINUS:
                {
                alt8=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 8, 0, input);

                throw nvae;

            }

            switch (alt8) {
                case 1 :
                    // PLSQL_DMLParser.g:202:11: union_key ^ ( all_key )?
                    {
                    pushFollow(FOLLOW_union_key_in_subquery_operation_part893);
                    union_key25=gPLSQLParser.union_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(union_key25.getTree(), root_0);

                    // PLSQL_DMLParser.g:202:22: ( all_key )?
                    int alt7=2;
                    int LA7_0 = input.LA(1);

                    if ( (LA7_0==SQL92_RESERVED_ALL) ) {
                        alt7=1;
                    }
                    switch (alt7) {
                        case 1 :
                            // PLSQL_DMLParser.g:202:22: all_key
                            {
                            pushFollow(FOLLOW_all_key_in_subquery_operation_part896);
                            all_key26=gPLSQLParser.all_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, all_key26.getTree());

                            }
                            break;

                    }


                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:202:31: intersect_key ^
                    {
                    pushFollow(FOLLOW_intersect_key_in_subquery_operation_part899);
                    intersect_key27=gPLSQLParser.intersect_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(intersect_key27.getTree(), root_0);

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:202:46: minus_key ^
                    {
                    pushFollow(FOLLOW_minus_key_in_subquery_operation_part902);
                    minus_key28=gPLSQLParser.minus_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(minus_key28.getTree(), root_0);

                    }
                    break;

            }


            pushFollow(FOLLOW_subquery_basic_elements_in_subquery_operation_part906);
            subquery_basic_elements29=subquery_basic_elements();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, subquery_basic_elements29.getTree());

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "subquery_operation_part"


    public static class subquery_basic_elements_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "subquery_basic_elements"
    // PLSQL_DMLParser.g:205:1: subquery_basic_elements : ( query_block | LEFT_PAREN ! subquery RIGHT_PAREN !);
    public final PLSQLParser_PLSQL_DMLParser.subquery_basic_elements_return subquery_basic_elements() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.subquery_basic_elements_return retval = new PLSQLParser_PLSQL_DMLParser.subquery_basic_elements_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN31=null;
        Token RIGHT_PAREN33=null;
        PLSQLParser_PLSQL_DMLParser.query_block_return query_block30 =null;

        PLSQLParser_PLSQL_DMLParser.subquery_return subquery32 =null;


        Object LEFT_PAREN31_tree=null;
        Object RIGHT_PAREN33_tree=null;

        try {
            // PLSQL_DMLParser.g:206:5: ( query_block | LEFT_PAREN ! subquery RIGHT_PAREN !)
            int alt9=2;
            int LA9_0 = input.LA(1);

            if ( (LA9_0==SQL92_RESERVED_SELECT) ) {
                alt9=1;
            }
            else if ( (LA9_0==LEFT_PAREN) ) {
                alt9=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 9, 0, input);

                throw nvae;

            }
            switch (alt9) {
                case 1 :
                    // PLSQL_DMLParser.g:206:10: query_block
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_query_block_in_subquery_basic_elements926);
                    query_block30=query_block();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, query_block30.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:207:10: LEFT_PAREN ! subquery RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    LEFT_PAREN31=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_subquery_basic_elements937); if (state.failed) return retval;

                    pushFollow(FOLLOW_subquery_in_subquery_basic_elements940);
                    subquery32=subquery();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, subquery32.getTree());

                    RIGHT_PAREN33=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_subquery_basic_elements942); if (state.failed) return retval;

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "subquery_basic_elements"


    public static class query_block_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "query_block"
    // PLSQL_DMLParser.g:210:1: query_block : select_key ( ( distinct_key | unique_key | all_key )=> ( distinct_key | unique_key | all_key ) )? ( ASTERISK | selected_element ( COMMA selected_element )* ) ( into_clause )? from_clause ( where_clause )? ( hierarchical_query_clause )? ( group_by_clause )? ( having_clause )? ( model_clause )? -> {mode == 1}? ^( select_key from_clause ( distinct_key )? ( unique_key )? ( all_key )? ASTERISK ( into_clause )? ( where_clause )? ( hierarchical_query_clause )? ( group_by_clause )? ( having_clause )? ( model_clause )? ) -> ^( select_key from_clause ( distinct_key )? ( unique_key )? ( all_key )? ^( SELECT_LIST ( selected_element )+ ) ( into_clause )? ( where_clause )? ( hierarchical_query_clause )? ( group_by_clause )? ( having_clause )? ( model_clause )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.query_block_return query_block() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.query_block_return retval = new PLSQLParser_PLSQL_DMLParser.query_block_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token ASTERISK38=null;
        Token COMMA40=null;
        PLSQLParser_PLSQLKeys.select_key_return select_key34 =null;

        PLSQLParser_PLSQLKeys.distinct_key_return distinct_key35 =null;

        PLSQLParser_PLSQLKeys.unique_key_return unique_key36 =null;

        PLSQLParser_PLSQLKeys.all_key_return all_key37 =null;

        PLSQLParser_PLSQL_DMLParser.selected_element_return selected_element39 =null;

        PLSQLParser_PLSQL_DMLParser.selected_element_return selected_element41 =null;

        PLSQLParser_PLSQLCommons.into_clause_return into_clause42 =null;

        PLSQLParser_PLSQL_DMLParser.from_clause_return from_clause43 =null;

        PLSQLParser_PLSQLCommons.where_clause_return where_clause44 =null;

        PLSQLParser_PLSQL_DMLParser.hierarchical_query_clause_return hierarchical_query_clause45 =null;

        PLSQLParser_PLSQL_DMLParser.group_by_clause_return group_by_clause46 =null;

        PLSQLParser_PLSQL_DMLParser.having_clause_return having_clause47 =null;

        PLSQLParser_PLSQL_DMLParser.model_clause_return model_clause48 =null;


        Object ASTERISK38_tree=null;
        Object COMMA40_tree=null;
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleTokenStream stream_ASTERISK=new RewriteRuleTokenStream(adaptor,"token ASTERISK");
        RewriteRuleSubtreeStream stream_all_key=new RewriteRuleSubtreeStream(adaptor,"rule all_key");
        RewriteRuleSubtreeStream stream_from_clause=new RewriteRuleSubtreeStream(adaptor,"rule from_clause");
        RewriteRuleSubtreeStream stream_having_clause=new RewriteRuleSubtreeStream(adaptor,"rule having_clause");
        RewriteRuleSubtreeStream stream_where_clause=new RewriteRuleSubtreeStream(adaptor,"rule where_clause");
        RewriteRuleSubtreeStream stream_into_clause=new RewriteRuleSubtreeStream(adaptor,"rule into_clause");
        RewriteRuleSubtreeStream stream_distinct_key=new RewriteRuleSubtreeStream(adaptor,"rule distinct_key");
        RewriteRuleSubtreeStream stream_group_by_clause=new RewriteRuleSubtreeStream(adaptor,"rule group_by_clause");
        RewriteRuleSubtreeStream stream_selected_element=new RewriteRuleSubtreeStream(adaptor,"rule selected_element");
        RewriteRuleSubtreeStream stream_unique_key=new RewriteRuleSubtreeStream(adaptor,"rule unique_key");
        RewriteRuleSubtreeStream stream_model_clause=new RewriteRuleSubtreeStream(adaptor,"rule model_clause");
        RewriteRuleSubtreeStream stream_select_key=new RewriteRuleSubtreeStream(adaptor,"rule select_key");
        RewriteRuleSubtreeStream stream_hierarchical_query_clause=new RewriteRuleSubtreeStream(adaptor,"rule hierarchical_query_clause");
            int mode = 0;    
        try {
            // PLSQL_DMLParser.g:212:5: ( select_key ( ( distinct_key | unique_key | all_key )=> ( distinct_key | unique_key | all_key ) )? ( ASTERISK | selected_element ( COMMA selected_element )* ) ( into_clause )? from_clause ( where_clause )? ( hierarchical_query_clause )? ( group_by_clause )? ( having_clause )? ( model_clause )? -> {mode == 1}? ^( select_key from_clause ( distinct_key )? ( unique_key )? ( all_key )? ASTERISK ( into_clause )? ( where_clause )? ( hierarchical_query_clause )? ( group_by_clause )? ( having_clause )? ( model_clause )? ) -> ^( select_key from_clause ( distinct_key )? ( unique_key )? ( all_key )? ^( SELECT_LIST ( selected_element )+ ) ( into_clause )? ( where_clause )? ( hierarchical_query_clause )? ( group_by_clause )? ( having_clause )? ( model_clause )? ) )
            // PLSQL_DMLParser.g:212:10: select_key ( ( distinct_key | unique_key | all_key )=> ( distinct_key | unique_key | all_key ) )? ( ASTERISK | selected_element ( COMMA selected_element )* ) ( into_clause )? from_clause ( where_clause )? ( hierarchical_query_clause )? ( group_by_clause )? ( having_clause )? ( model_clause )?
            {
            pushFollow(FOLLOW_select_key_in_query_block971);
            select_key34=gPLSQLParser.select_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_select_key.add(select_key34.getTree());

            // PLSQL_DMLParser.g:213:9: ( ( distinct_key | unique_key | all_key )=> ( distinct_key | unique_key | all_key ) )?
            int alt11=2;
            int LA11_0 = input.LA(1);

            if ( (LA11_0==SQL92_RESERVED_DISTINCT) ) {
                int LA11_1 = input.LA(2);

                if ( (synpred2_PLSQL_DMLParser()) ) {
                    alt11=1;
                }
            }
            else if ( (LA11_0==SQL92_RESERVED_UNIQUE) && (synpred2_PLSQL_DMLParser())) {
                alt11=1;
            }
            else if ( (LA11_0==SQL92_RESERVED_ALL) ) {
                int LA11_3 = input.LA(2);

                if ( (synpred2_PLSQL_DMLParser()) ) {
                    alt11=1;
                }
            }
            switch (alt11) {
                case 1 :
                    // PLSQL_DMLParser.g:213:10: ( distinct_key | unique_key | all_key )=> ( distinct_key | unique_key | all_key )
                    {
                    // PLSQL_DMLParser.g:213:46: ( distinct_key | unique_key | all_key )
                    int alt10=3;
                    switch ( input.LA(1) ) {
                    case SQL92_RESERVED_DISTINCT:
                        {
                        alt10=1;
                        }
                        break;
                    case SQL92_RESERVED_UNIQUE:
                        {
                        alt10=2;
                        }
                        break;
                    case SQL92_RESERVED_ALL:
                        {
                        alt10=3;
                        }
                        break;
                    default:
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 10, 0, input);

                        throw nvae;

                    }

                    switch (alt10) {
                        case 1 :
                            // PLSQL_DMLParser.g:213:47: distinct_key
                            {
                            pushFollow(FOLLOW_distinct_key_in_query_block992);
                            distinct_key35=gPLSQLParser.distinct_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_distinct_key.add(distinct_key35.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:213:60: unique_key
                            {
                            pushFollow(FOLLOW_unique_key_in_query_block994);
                            unique_key36=gPLSQLParser.unique_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_unique_key.add(unique_key36.getTree());

                            }
                            break;
                        case 3 :
                            // PLSQL_DMLParser.g:213:71: all_key
                            {
                            pushFollow(FOLLOW_all_key_in_query_block996);
                            all_key37=gPLSQLParser.all_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_all_key.add(all_key37.getTree());

                            }
                            break;

                    }


                    }
                    break;

            }


            // PLSQL_DMLParser.g:214:9: ( ASTERISK | selected_element ( COMMA selected_element )* )
            int alt13=2;
            int LA13_0 = input.LA(1);

            if ( (LA13_0==ASTERISK) ) {
                alt13=1;
            }
            else if ( (LA13_0==APPROXIMATE_NUM_LIT||(LA13_0 >= CHAR_STRING && LA13_0 <= COLON)||LA13_0==DELIMITED_ID||LA13_0==EXACT_NUM_LIT||LA13_0==INTRODUCER||LA13_0==LEFT_PAREN||LA13_0==MINUS_SIGN||LA13_0==PLUS_SIGN||LA13_0==REGULAR_ID||LA13_0==SQL92_RESERVED_ALL||LA13_0==SQL92_RESERVED_ANY||LA13_0==SQL92_RESERVED_CASE||LA13_0==SQL92_RESERVED_DEFAULT||LA13_0==SQL92_RESERVED_DISTINCT||(LA13_0 >= SQL92_RESERVED_EXISTS && LA13_0 <= SQL92_RESERVED_FALSE)||(LA13_0 >= SQL92_RESERVED_NOT && LA13_0 <= SQL92_RESERVED_NULL)||LA13_0==SQL92_RESERVED_PRIOR||LA13_0==SQL92_RESERVED_TRUE||LA13_0==UNSIGNED_INTEGER) ) {
                alt13=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 13, 0, input);

                throw nvae;

            }
            switch (alt13) {
                case 1 :
                    // PLSQL_DMLParser.g:214:10: ASTERISK
                    {
                    ASTERISK38=(Token)match(input,ASTERISK,FOLLOW_ASTERISK_in_query_block1010); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_ASTERISK.add(ASTERISK38);


                    if ( state.backtracking==0 ) {mode = 1;}

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:214:32: selected_element ( COMMA selected_element )*
                    {
                    pushFollow(FOLLOW_selected_element_in_query_block1015);
                    selected_element39=selected_element();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_selected_element.add(selected_element39.getTree());

                    // PLSQL_DMLParser.g:214:49: ( COMMA selected_element )*
                    loop12:
                    do {
                        int alt12=2;
                        int LA12_0 = input.LA(1);

                        if ( (LA12_0==COMMA) ) {
                            alt12=1;
                        }


                        switch (alt12) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:214:50: COMMA selected_element
                    	    {
                    	    COMMA40=(Token)match(input,COMMA,FOLLOW_COMMA_in_query_block1018); if (state.failed) return retval; 
                    	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA40);


                    	    pushFollow(FOLLOW_selected_element_in_query_block1020);
                    	    selected_element41=selected_element();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_selected_element.add(selected_element41.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop12;
                        }
                    } while (true);


                    }
                    break;

            }


            // PLSQL_DMLParser.g:215:9: ( into_clause )?
            int alt14=2;
            int LA14_0 = input.LA(1);

            if ( (LA14_0==SQL92_RESERVED_INTO) ) {
                alt14=1;
            }
            else if ( (LA14_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("bulk")))) {
                alt14=1;
            }
            switch (alt14) {
                case 1 :
                    // PLSQL_DMLParser.g:215:9: into_clause
                    {
                    pushFollow(FOLLOW_into_clause_in_query_block1033);
                    into_clause42=gPLSQLParser.into_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_into_clause.add(into_clause42.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_from_clause_in_query_block1044);
            from_clause43=from_clause();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_from_clause.add(from_clause43.getTree());

            // PLSQL_DMLParser.g:217:9: ( where_clause )?
            int alt15=2;
            int LA15_0 = input.LA(1);

            if ( (LA15_0==SQL92_RESERVED_WHERE) ) {
                alt15=1;
            }
            switch (alt15) {
                case 1 :
                    // PLSQL_DMLParser.g:217:9: where_clause
                    {
                    pushFollow(FOLLOW_where_clause_in_query_block1055);
                    where_clause44=gPLSQLParser.where_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_where_clause.add(where_clause44.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:218:9: ( hierarchical_query_clause )?
            int alt16=2;
            int LA16_0 = input.LA(1);

            if ( (LA16_0==PLSQL_RESERVED_START||LA16_0==SQL92_RESERVED_CONNECT) ) {
                alt16=1;
            }
            switch (alt16) {
                case 1 :
                    // PLSQL_DMLParser.g:218:9: hierarchical_query_clause
                    {
                    pushFollow(FOLLOW_hierarchical_query_clause_in_query_block1067);
                    hierarchical_query_clause45=hierarchical_query_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_hierarchical_query_clause.add(hierarchical_query_clause45.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:219:9: ( group_by_clause )?
            int alt17=2;
            int LA17_0 = input.LA(1);

            if ( (LA17_0==SQL92_RESERVED_GROUP) ) {
                alt17=1;
            }
            switch (alt17) {
                case 1 :
                    // PLSQL_DMLParser.g:219:9: group_by_clause
                    {
                    pushFollow(FOLLOW_group_by_clause_in_query_block1079);
                    group_by_clause46=group_by_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_group_by_clause.add(group_by_clause46.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:220:9: ( having_clause )?
            int alt18=2;
            int LA18_0 = input.LA(1);

            if ( (LA18_0==SQL92_RESERVED_HAVING) ) {
                alt18=1;
            }
            switch (alt18) {
                case 1 :
                    // PLSQL_DMLParser.g:220:9: having_clause
                    {
                    pushFollow(FOLLOW_having_clause_in_query_block1090);
                    having_clause47=having_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_having_clause.add(having_clause47.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:221:9: ( model_clause )?
            int alt19=2;
            int LA19_0 = input.LA(1);

            if ( (LA19_0==PLSQL_NON_RESERVED_MODEL) ) {
                alt19=1;
            }
            switch (alt19) {
                case 1 :
                    // PLSQL_DMLParser.g:221:9: model_clause
                    {
                    pushFollow(FOLLOW_model_clause_in_query_block1102);
                    model_clause48=model_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_model_clause.add(model_clause48.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: unique_key, distinct_key, hierarchical_query_clause, group_by_clause, selected_element, hierarchical_query_clause, model_clause, having_clause, having_clause, select_key, where_clause, distinct_key, ASTERISK, all_key, from_clause, all_key, from_clause, select_key, where_clause, unique_key, into_clause, model_clause, into_clause, group_by_clause
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 222:9: -> {mode == 1}? ^( select_key from_clause ( distinct_key )? ( unique_key )? ( all_key )? ASTERISK ( into_clause )? ( where_clause )? ( hierarchical_query_clause )? ( group_by_clause )? ( having_clause )? ( model_clause )? )
            if (mode == 1) {
                // PLSQL_DMLParser.g:222:25: ^( select_key from_clause ( distinct_key )? ( unique_key )? ( all_key )? ASTERISK ( into_clause )? ( where_clause )? ( hierarchical_query_clause )? ( group_by_clause )? ( having_clause )? ( model_clause )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_select_key.nextNode(), root_1);

                adaptor.addChild(root_1, stream_from_clause.nextTree());

                // PLSQL_DMLParser.g:222:50: ( distinct_key )?
                if ( stream_distinct_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_distinct_key.nextTree());

                }
                stream_distinct_key.reset();

                // PLSQL_DMLParser.g:222:64: ( unique_key )?
                if ( stream_unique_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_unique_key.nextTree());

                }
                stream_unique_key.reset();

                // PLSQL_DMLParser.g:222:76: ( all_key )?
                if ( stream_all_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_all_key.nextTree());

                }
                stream_all_key.reset();

                adaptor.addChild(root_1, 
                stream_ASTERISK.nextNode()
                );

                // PLSQL_DMLParser.g:223:17: ( into_clause )?
                if ( stream_into_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_into_clause.nextTree());

                }
                stream_into_clause.reset();

                // PLSQL_DMLParser.g:223:30: ( where_clause )?
                if ( stream_where_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_where_clause.nextTree());

                }
                stream_where_clause.reset();

                // PLSQL_DMLParser.g:223:44: ( hierarchical_query_clause )?
                if ( stream_hierarchical_query_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_hierarchical_query_clause.nextTree());

                }
                stream_hierarchical_query_clause.reset();

                // PLSQL_DMLParser.g:223:71: ( group_by_clause )?
                if ( stream_group_by_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_group_by_clause.nextTree());

                }
                stream_group_by_clause.reset();

                // PLSQL_DMLParser.g:223:88: ( having_clause )?
                if ( stream_having_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_having_clause.nextTree());

                }
                stream_having_clause.reset();

                // PLSQL_DMLParser.g:223:103: ( model_clause )?
                if ( stream_model_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_model_clause.nextTree());

                }
                stream_model_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }

            else // 224:9: -> ^( select_key from_clause ( distinct_key )? ( unique_key )? ( all_key )? ^( SELECT_LIST ( selected_element )+ ) ( into_clause )? ( where_clause )? ( hierarchical_query_clause )? ( group_by_clause )? ( having_clause )? ( model_clause )? )
            {
                // PLSQL_DMLParser.g:224:12: ^( select_key from_clause ( distinct_key )? ( unique_key )? ( all_key )? ^( SELECT_LIST ( selected_element )+ ) ( into_clause )? ( where_clause )? ( hierarchical_query_clause )? ( group_by_clause )? ( having_clause )? ( model_clause )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_select_key.nextNode(), root_1);

                adaptor.addChild(root_1, stream_from_clause.nextTree());

                // PLSQL_DMLParser.g:224:37: ( distinct_key )?
                if ( stream_distinct_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_distinct_key.nextTree());

                }
                stream_distinct_key.reset();

                // PLSQL_DMLParser.g:224:51: ( unique_key )?
                if ( stream_unique_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_unique_key.nextTree());

                }
                stream_unique_key.reset();

                // PLSQL_DMLParser.g:224:63: ( all_key )?
                if ( stream_all_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_all_key.nextTree());

                }
                stream_all_key.reset();

                // PLSQL_DMLParser.g:224:72: ^( SELECT_LIST ( selected_element )+ )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(SELECT_LIST, "SELECT_LIST")
                , root_2);

                if ( !(stream_selected_element.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_selected_element.hasNext() ) {
                    adaptor.addChild(root_2, stream_selected_element.nextTree());

                }
                stream_selected_element.reset();

                adaptor.addChild(root_1, root_2);
                }

                // PLSQL_DMLParser.g:225:17: ( into_clause )?
                if ( stream_into_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_into_clause.nextTree());

                }
                stream_into_clause.reset();

                // PLSQL_DMLParser.g:225:30: ( where_clause )?
                if ( stream_where_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_where_clause.nextTree());

                }
                stream_where_clause.reset();

                // PLSQL_DMLParser.g:225:44: ( hierarchical_query_clause )?
                if ( stream_hierarchical_query_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_hierarchical_query_clause.nextTree());

                }
                stream_hierarchical_query_clause.reset();

                // PLSQL_DMLParser.g:225:71: ( group_by_clause )?
                if ( stream_group_by_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_group_by_clause.nextTree());

                }
                stream_group_by_clause.reset();

                // PLSQL_DMLParser.g:225:88: ( having_clause )?
                if ( stream_having_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_having_clause.nextTree());

                }
                stream_having_clause.reset();

                // PLSQL_DMLParser.g:225:103: ( model_clause )?
                if ( stream_model_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_model_clause.nextTree());

                }
                stream_model_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "query_block"


    public static class selected_element_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "selected_element"
    // PLSQL_DMLParser.g:228:1: selected_element : select_list_elements ( alias )? -> ^( SELECT_ITEM select_list_elements ( alias )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.selected_element_return selected_element() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.selected_element_return retval = new PLSQLParser_PLSQL_DMLParser.selected_element_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.select_list_elements_return select_list_elements49 =null;

        PLSQLParser_PLSQLCommons.alias_return alias50 =null;


        RewriteRuleSubtreeStream stream_alias=new RewriteRuleSubtreeStream(adaptor,"rule alias");
        RewriteRuleSubtreeStream stream_select_list_elements=new RewriteRuleSubtreeStream(adaptor,"rule select_list_elements");
        try {
            // PLSQL_DMLParser.g:229:5: ( select_list_elements ( alias )? -> ^( SELECT_ITEM select_list_elements ( alias )? ) )
            // PLSQL_DMLParser.g:229:10: select_list_elements ( alias )?
            {
            pushFollow(FOLLOW_select_list_elements_in_selected_element1254);
            select_list_elements49=select_list_elements();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_select_list_elements.add(select_list_elements49.getTree());

            // PLSQL_DMLParser.g:229:31: ( alias )?
            int alt20=2;
            int LA20_0 = input.LA(1);

            if ( (LA20_0==CHAR_STRING||LA20_0==DELIMITED_ID||LA20_0==INTRODUCER||LA20_0==SQL92_RESERVED_AS) ) {
                alt20=1;
            }
            else if ( (LA20_0==REGULAR_ID) ) {
                int LA20_2 = input.LA(2);

                if ( (LA20_2==COMMA||LA20_2==SQL92_RESERVED_FROM||LA20_2==SQL92_RESERVED_INTO) ) {
                    alt20=1;
                }
                else if ( (LA20_2==REGULAR_ID) ) {
                    int LA20_4 = input.LA(3);

                    if ( (LA20_4==REGULAR_ID) ) {
                        alt20=1;
                    }
                }
            }
            switch (alt20) {
                case 1 :
                    // PLSQL_DMLParser.g:229:31: alias
                    {
                    pushFollow(FOLLOW_alias_in_selected_element1256);
                    alias50=gPLSQLParser.alias();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_alias.add(alias50.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: alias, select_list_elements
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 230:9: -> ^( SELECT_ITEM select_list_elements ( alias )? )
            {
                // PLSQL_DMLParser.g:230:12: ^( SELECT_ITEM select_list_elements ( alias )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(SELECT_ITEM, "SELECT_ITEM")
                , root_1);

                adaptor.addChild(root_1, stream_select_list_elements.nextTree());

                // PLSQL_DMLParser.g:230:47: ( alias )?
                if ( stream_alias.hasNext() ) {
                    adaptor.addChild(root_1, stream_alias.nextTree());

                }
                stream_alias.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "selected_element"


    public static class from_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "from_clause"
    // PLSQL_DMLParser.g:233:1: from_clause : from_key ^ table_ref_list ;
    public final PLSQLParser_PLSQL_DMLParser.from_clause_return from_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.from_clause_return retval = new PLSQLParser_PLSQL_DMLParser.from_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.from_key_return from_key51 =null;

        PLSQLParser_PLSQL_DMLParser.table_ref_list_return table_ref_list52 =null;



        try {
            // PLSQL_DMLParser.g:234:5: ( from_key ^ table_ref_list )
            // PLSQL_DMLParser.g:234:10: from_key ^ table_ref_list
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_from_key_in_from_clause1296);
            from_key51=gPLSQLParser.from_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(from_key51.getTree(), root_0);

            pushFollow(FOLLOW_table_ref_list_in_from_clause1299);
            table_ref_list52=table_ref_list();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, table_ref_list52.getTree());

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "from_clause"


    public static class select_list_elements_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "select_list_elements"
    // PLSQL_DMLParser.g:237:1: select_list_elements : ( ( tableview_name PERIOD ASTERISK )=> tableview_name PERIOD ASTERISK -> ^( EXPR ^( DOT_ASTERISK[$ASTERISK] tableview_name ) ) | expression -> ^( EXPR expression ) );
    public final PLSQLParser_PLSQL_DMLParser.select_list_elements_return select_list_elements() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.select_list_elements_return retval = new PLSQLParser_PLSQL_DMLParser.select_list_elements_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token PERIOD54=null;
        Token ASTERISK55=null;
        PLSQLParser_PLSQLCommons.tableview_name_return tableview_name53 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression56 =null;


        Object PERIOD54_tree=null;
        Object ASTERISK55_tree=null;
        RewriteRuleTokenStream stream_PERIOD=new RewriteRuleTokenStream(adaptor,"token PERIOD");
        RewriteRuleTokenStream stream_ASTERISK=new RewriteRuleTokenStream(adaptor,"token ASTERISK");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_tableview_name=new RewriteRuleSubtreeStream(adaptor,"rule tableview_name");
        try {
            // PLSQL_DMLParser.g:238:5: ( ( tableview_name PERIOD ASTERISK )=> tableview_name PERIOD ASTERISK -> ^( EXPR ^( DOT_ASTERISK[$ASTERISK] tableview_name ) ) | expression -> ^( EXPR expression ) )
            int alt21=2;
            switch ( input.LA(1) ) {
            case INTRODUCER:
                {
                int LA21_1 = input.LA(2);

                if ( (synpred3_PLSQL_DMLParser()) ) {
                    alt21=1;
                }
                else if ( (true) ) {
                    alt21=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 21, 1, input);

                    throw nvae;

                }
                }
                break;
            case REGULAR_ID:
                {
                int LA21_2 = input.LA(2);

                if ( (synpred3_PLSQL_DMLParser()) ) {
                    alt21=1;
                }
                else if ( (true) ) {
                    alt21=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 21, 2, input);

                    throw nvae;

                }
                }
                break;
            case DELIMITED_ID:
                {
                int LA21_3 = input.LA(2);

                if ( (synpred3_PLSQL_DMLParser()) ) {
                    alt21=1;
                }
                else if ( (true) ) {
                    alt21=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 21, 3, input);

                    throw nvae;

                }
                }
                break;
            case APPROXIMATE_NUM_LIT:
            case CHAR_STRING:
            case COLON:
            case EXACT_NUM_LIT:
            case LEFT_PAREN:
            case MINUS_SIGN:
            case PLUS_SIGN:
            case SQL92_RESERVED_ALL:
            case SQL92_RESERVED_ANY:
            case SQL92_RESERVED_CASE:
            case SQL92_RESERVED_DEFAULT:
            case SQL92_RESERVED_DISTINCT:
            case SQL92_RESERVED_EXISTS:
            case SQL92_RESERVED_FALSE:
            case SQL92_RESERVED_NOT:
            case SQL92_RESERVED_NULL:
            case SQL92_RESERVED_PRIOR:
            case SQL92_RESERVED_TRUE:
            case UNSIGNED_INTEGER:
                {
                alt21=2;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 21, 0, input);

                throw nvae;

            }

            switch (alt21) {
                case 1 :
                    // PLSQL_DMLParser.g:238:10: ( tableview_name PERIOD ASTERISK )=> tableview_name PERIOD ASTERISK
                    {
                    pushFollow(FOLLOW_tableview_name_in_select_list_elements1328);
                    tableview_name53=gPLSQLParser.tableview_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_tableview_name.add(tableview_name53.getTree());

                    PERIOD54=(Token)match(input,PERIOD,FOLLOW_PERIOD_in_select_list_elements1330); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_PERIOD.add(PERIOD54);


                    ASTERISK55=(Token)match(input,ASTERISK,FOLLOW_ASTERISK_in_select_list_elements1332); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_ASTERISK.add(ASTERISK55);


                    // AST REWRITE
                    // elements: tableview_name
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 238:76: -> ^( EXPR ^( DOT_ASTERISK[$ASTERISK] tableview_name ) )
                    {
                        // PLSQL_DMLParser.g:238:79: ^( EXPR ^( DOT_ASTERISK[$ASTERISK] tableview_name ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(EXPR, "EXPR")
                        , root_1);

                        // PLSQL_DMLParser.g:238:86: ^( DOT_ASTERISK[$ASTERISK] tableview_name )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(DOT_ASTERISK, ASTERISK55)
                        , root_2);

                        adaptor.addChild(root_2, stream_tableview_name.nextTree());

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:239:10: expression
                    {
                    pushFollow(FOLLOW_expression_in_select_list_elements1358);
                    expression56=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(expression56.getTree());

                    // AST REWRITE
                    // elements: expression
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 239:21: -> ^( EXPR expression )
                    {
                        // PLSQL_DMLParser.g:239:24: ^( EXPR expression )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(EXPR, "EXPR")
                        , root_1);

                        adaptor.addChild(root_1, stream_expression.nextTree());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "select_list_elements"


    public static class table_ref_list_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "table_ref_list"
    // PLSQL_DMLParser.g:242:1: table_ref_list : table_ref ( COMMA ! table_ref )* ;
    public final PLSQLParser_PLSQL_DMLParser.table_ref_list_return table_ref_list() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.table_ref_list_return retval = new PLSQLParser_PLSQL_DMLParser.table_ref_list_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COMMA58=null;
        PLSQLParser_PLSQL_DMLParser.table_ref_return table_ref57 =null;

        PLSQLParser_PLSQL_DMLParser.table_ref_return table_ref59 =null;


        Object COMMA58_tree=null;

        try {
            // PLSQL_DMLParser.g:243:5: ( table_ref ( COMMA ! table_ref )* )
            // PLSQL_DMLParser.g:243:10: table_ref ( COMMA ! table_ref )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_table_ref_in_table_ref_list1386);
            table_ref57=table_ref();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, table_ref57.getTree());

            // PLSQL_DMLParser.g:243:20: ( COMMA ! table_ref )*
            loop22:
            do {
                int alt22=2;
                alt22 = dfa22.predict(input);
                switch (alt22) {
            	case 1 :
            	    // PLSQL_DMLParser.g:243:21: COMMA ! table_ref
            	    {
            	    COMMA58=(Token)match(input,COMMA,FOLLOW_COMMA_in_table_ref_list1389); if (state.failed) return retval;

            	    pushFollow(FOLLOW_table_ref_in_table_ref_list1392);
            	    table_ref59=table_ref();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, table_ref59.getTree());

            	    }
            	    break;

            	default :
            	    break loop22;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "table_ref_list"


    public static class table_ref_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "table_ref"
    // PLSQL_DMLParser.g:246:1: table_ref : table_ref_aux ( join_clause )* -> ^( TABLE_REF table_ref_aux ( join_clause )* ) ;
    public final PLSQLParser_PLSQL_DMLParser.table_ref_return table_ref() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.table_ref_return retval = new PLSQLParser_PLSQL_DMLParser.table_ref_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.table_ref_aux_return table_ref_aux60 =null;

        PLSQLParser_PLSQL_DMLParser.join_clause_return join_clause61 =null;


        RewriteRuleSubtreeStream stream_join_clause=new RewriteRuleSubtreeStream(adaptor,"rule join_clause");
        RewriteRuleSubtreeStream stream_table_ref_aux=new RewriteRuleSubtreeStream(adaptor,"rule table_ref_aux");
        try {
            // PLSQL_DMLParser.g:247:5: ( table_ref_aux ( join_clause )* -> ^( TABLE_REF table_ref_aux ( join_clause )* ) )
            // PLSQL_DMLParser.g:247:10: table_ref_aux ( join_clause )*
            {
            pushFollow(FOLLOW_table_ref_aux_in_table_ref1414);
            table_ref_aux60=table_ref_aux();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_table_ref_aux.add(table_ref_aux60.getTree());

            // PLSQL_DMLParser.g:247:24: ( join_clause )*
            loop23:
            do {
                int alt23=2;
                int LA23_0 = input.LA(1);

                if ( (LA23_0==REGULAR_ID) ) {
                    int LA23_21 = input.LA(2);

                    if ( (((input.LT(1).getText().equalsIgnoreCase("natural"))||(input.LT(1).getText().equalsIgnoreCase("join"))||(input.LT(1).getText().equalsIgnoreCase("left"))||(input.LT(1).getText().equalsIgnoreCase("inner"))||(input.LT(1).getText().equalsIgnoreCase("full"))||(input.LT(1).getText().equalsIgnoreCase("partition"))||(input.LT(1).getText().equalsIgnoreCase("right"))||(input.LT(1).getText().equalsIgnoreCase("cross")))) ) {
                        alt23=1;
                    }


                }


                switch (alt23) {
            	case 1 :
            	    // PLSQL_DMLParser.g:247:24: join_clause
            	    {
            	    pushFollow(FOLLOW_join_clause_in_table_ref1416);
            	    join_clause61=join_clause();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_join_clause.add(join_clause61.getTree());

            	    }
            	    break;

            	default :
            	    break loop23;
                }
            } while (true);


            // AST REWRITE
            // elements: join_clause, table_ref_aux
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 248:9: -> ^( TABLE_REF table_ref_aux ( join_clause )* )
            {
                // PLSQL_DMLParser.g:248:12: ^( TABLE_REF table_ref_aux ( join_clause )* )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(TABLE_REF, "TABLE_REF")
                , root_1);

                adaptor.addChild(root_1, stream_table_ref_aux.nextTree());

                // PLSQL_DMLParser.g:248:38: ( join_clause )*
                while ( stream_join_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_join_clause.nextTree());

                }
                stream_join_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "table_ref"


    public static class table_ref_aux_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "table_ref_aux"
    // PLSQL_DMLParser.g:251:1: table_ref_aux : ( dml_table_expression_clause ( pivot_clause | unpivot_clause )? | only_key LEFT_PAREN dml_table_expression_clause RIGHT_PAREN ) ( flashback_query_clause )* ({...}? alias )? -> ^( TABLE_REF_ELEMENT ( alias )? dml_table_expression_clause ( only_key )? ( pivot_clause )? ( unpivot_clause )? ( flashback_query_clause )* ) ;
    public final PLSQLParser_PLSQL_DMLParser.table_ref_aux_return table_ref_aux() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.table_ref_aux_return retval = new PLSQLParser_PLSQL_DMLParser.table_ref_aux_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN66=null;
        Token RIGHT_PAREN68=null;
        PLSQLParser_PLSQL_DMLParser.dml_table_expression_clause_return dml_table_expression_clause62 =null;

        PLSQLParser_PLSQL_DMLParser.pivot_clause_return pivot_clause63 =null;

        PLSQLParser_PLSQL_DMLParser.unpivot_clause_return unpivot_clause64 =null;

        PLSQLParser_PLSQLKeys.only_key_return only_key65 =null;

        PLSQLParser_PLSQL_DMLParser.dml_table_expression_clause_return dml_table_expression_clause67 =null;

        PLSQLParser_PLSQL_DMLParser.flashback_query_clause_return flashback_query_clause69 =null;

        PLSQLParser_PLSQLCommons.alias_return alias70 =null;


        Object LEFT_PAREN66_tree=null;
        Object RIGHT_PAREN68_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleSubtreeStream stream_dml_table_expression_clause=new RewriteRuleSubtreeStream(adaptor,"rule dml_table_expression_clause");
        RewriteRuleSubtreeStream stream_unpivot_clause=new RewriteRuleSubtreeStream(adaptor,"rule unpivot_clause");
        RewriteRuleSubtreeStream stream_alias=new RewriteRuleSubtreeStream(adaptor,"rule alias");
        RewriteRuleSubtreeStream stream_pivot_clause=new RewriteRuleSubtreeStream(adaptor,"rule pivot_clause");
        RewriteRuleSubtreeStream stream_only_key=new RewriteRuleSubtreeStream(adaptor,"rule only_key");
        RewriteRuleSubtreeStream stream_flashback_query_clause=new RewriteRuleSubtreeStream(adaptor,"rule flashback_query_clause");
        try {
            // PLSQL_DMLParser.g:252:5: ( ( dml_table_expression_clause ( pivot_clause | unpivot_clause )? | only_key LEFT_PAREN dml_table_expression_clause RIGHT_PAREN ) ( flashback_query_clause )* ({...}? alias )? -> ^( TABLE_REF_ELEMENT ( alias )? dml_table_expression_clause ( only_key )? ( pivot_clause )? ( unpivot_clause )? ( flashback_query_clause )* ) )
            // PLSQL_DMLParser.g:253:5: ( dml_table_expression_clause ( pivot_clause | unpivot_clause )? | only_key LEFT_PAREN dml_table_expression_clause RIGHT_PAREN ) ( flashback_query_clause )* ({...}? alias )?
            {
            // PLSQL_DMLParser.g:253:5: ( dml_table_expression_clause ( pivot_clause | unpivot_clause )? | only_key LEFT_PAREN dml_table_expression_clause RIGHT_PAREN )
            int alt25=2;
            int LA25_0 = input.LA(1);

            if ( (LA25_0==DELIMITED_ID||LA25_0==INTRODUCER||LA25_0==LEFT_PAREN||LA25_0==SQL92_RESERVED_TABLE) ) {
                alt25=1;
            }
            else if ( (LA25_0==REGULAR_ID) ) {
                int LA25_4 = input.LA(2);

                if ( (!(((input.LT(1).getText().equalsIgnoreCase("only"))))) ) {
                    alt25=1;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("only"))) ) {
                    alt25=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 25, 4, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 25, 0, input);

                throw nvae;

            }
            switch (alt25) {
                case 1 :
                    // PLSQL_DMLParser.g:253:10: dml_table_expression_clause ( pivot_clause | unpivot_clause )?
                    {
                    pushFollow(FOLLOW_dml_table_expression_clause_in_table_ref_aux1462);
                    dml_table_expression_clause62=dml_table_expression_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_dml_table_expression_clause.add(dml_table_expression_clause62.getTree());

                    // PLSQL_DMLParser.g:253:38: ( pivot_clause | unpivot_clause )?
                    int alt24=3;
                    int LA24_0 = input.LA(1);

                    if ( (LA24_0==REGULAR_ID) ) {
                        int LA24_1 = input.LA(2);

                        if ( (((input.LT(1).getText().equalsIgnoreCase("pivot")))) ) {
                            alt24=1;
                        }
                        else if ( (((input.LT(1).getText().equalsIgnoreCase("unpivot")))) ) {
                            alt24=2;
                        }
                    }
                    switch (alt24) {
                        case 1 :
                            // PLSQL_DMLParser.g:253:39: pivot_clause
                            {
                            pushFollow(FOLLOW_pivot_clause_in_table_ref_aux1465);
                            pivot_clause63=pivot_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_pivot_clause.add(pivot_clause63.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:253:52: unpivot_clause
                            {
                            pushFollow(FOLLOW_unpivot_clause_in_table_ref_aux1467);
                            unpivot_clause64=unpivot_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_unpivot_clause.add(unpivot_clause64.getTree());

                            }
                            break;

                    }


                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:254:10: only_key LEFT_PAREN dml_table_expression_clause RIGHT_PAREN
                    {
                    pushFollow(FOLLOW_only_key_in_table_ref_aux1480);
                    only_key65=gPLSQLParser.only_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_only_key.add(only_key65.getTree());

                    LEFT_PAREN66=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_table_ref_aux1482); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN66);


                    pushFollow(FOLLOW_dml_table_expression_clause_in_table_ref_aux1484);
                    dml_table_expression_clause67=dml_table_expression_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_dml_table_expression_clause.add(dml_table_expression_clause67.getTree());

                    RIGHT_PAREN68=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_table_ref_aux1486); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN68);


                    }
                    break;

            }


            // PLSQL_DMLParser.g:256:9: ( flashback_query_clause )*
            loop26:
            do {
                int alt26=2;
                int LA26_0 = input.LA(1);

                if ( (LA26_0==SQL92_RESERVED_AS) ) {
                    int LA26_1 = input.LA(2);

                    if ( (LA26_1==SQL92_RESERVED_OF) ) {
                        alt26=1;
                    }


                }
                else if ( (LA26_0==REGULAR_ID) ) {
                    int LA26_3 = input.LA(2);

                    if ( (LA26_3==SQL92_RESERVED_BETWEEN) && ((input.LT(1).getText().equalsIgnoreCase("versions")))) {
                        alt26=1;
                    }


                }


                switch (alt26) {
            	case 1 :
            	    // PLSQL_DMLParser.g:256:9: flashback_query_clause
            	    {
            	    pushFollow(FOLLOW_flashback_query_clause_in_table_ref_aux1502);
            	    flashback_query_clause69=flashback_query_clause();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_flashback_query_clause.add(flashback_query_clause69.getTree());

            	    }
            	    break;

            	default :
            	    break loop26;
                }
            } while (true);


            // PLSQL_DMLParser.g:257:9: ({...}? alias )?
            int alt27=2;
            alt27 = dfa27.predict(input);
            switch (alt27) {
                case 1 :
                    // PLSQL_DMLParser.g:257:10: {...}? alias
                    {
                    if ( !((isTableAlias())) ) {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        throw new FailedPredicateException(input, "table_ref_aux", "isTableAlias()");
                    }

                    pushFollow(FOLLOW_alias_in_table_ref_aux1516);
                    alias70=gPLSQLParser.alias();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_alias.add(alias70.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: pivot_clause, unpivot_clause, only_key, dml_table_expression_clause, alias, flashback_query_clause
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 258:9: -> ^( TABLE_REF_ELEMENT ( alias )? dml_table_expression_clause ( only_key )? ( pivot_clause )? ( unpivot_clause )? ( flashback_query_clause )* )
            {
                // PLSQL_DMLParser.g:258:12: ^( TABLE_REF_ELEMENT ( alias )? dml_table_expression_clause ( only_key )? ( pivot_clause )? ( unpivot_clause )? ( flashback_query_clause )* )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(TABLE_REF_ELEMENT, "TABLE_REF_ELEMENT")
                , root_1);

                // PLSQL_DMLParser.g:258:32: ( alias )?
                if ( stream_alias.hasNext() ) {
                    adaptor.addChild(root_1, stream_alias.nextTree());

                }
                stream_alias.reset();

                adaptor.addChild(root_1, stream_dml_table_expression_clause.nextTree());

                // PLSQL_DMLParser.g:258:67: ( only_key )?
                if ( stream_only_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_only_key.nextTree());

                }
                stream_only_key.reset();

                // PLSQL_DMLParser.g:258:77: ( pivot_clause )?
                if ( stream_pivot_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_pivot_clause.nextTree());

                }
                stream_pivot_clause.reset();

                // PLSQL_DMLParser.g:258:91: ( unpivot_clause )?
                if ( stream_unpivot_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_unpivot_clause.nextTree());

                }
                stream_unpivot_clause.reset();

                // PLSQL_DMLParser.g:258:107: ( flashback_query_clause )*
                while ( stream_flashback_query_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_flashback_query_clause.nextTree());

                }
                stream_flashback_query_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "table_ref_aux"


    public static class join_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "join_clause"
    // PLSQL_DMLParser.g:261:1: join_clause : ( query_partition_clause )? ( cross_key | natural_key )? ( inner_key | outer_join_type )? join_key table_ref_aux ( query_partition_clause )? ( join_on_part | join_using_part )? -> ^( JOIN_DEF[$join_key.start] ( cross_key )? ( natural_key )? ( inner_key )? ( outer_join_type )? table_ref_aux ( query_partition_clause )* ( join_on_part )? ( join_using_part )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.join_clause_return join_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.join_clause_return retval = new PLSQLParser_PLSQL_DMLParser.join_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.query_partition_clause_return query_partition_clause71 =null;

        PLSQLParser_PLSQLKeys.cross_key_return cross_key72 =null;

        PLSQLParser_PLSQLKeys.natural_key_return natural_key73 =null;

        PLSQLParser_PLSQLKeys.inner_key_return inner_key74 =null;

        PLSQLParser_PLSQL_DMLParser.outer_join_type_return outer_join_type75 =null;

        PLSQLParser_PLSQLKeys.join_key_return join_key76 =null;

        PLSQLParser_PLSQL_DMLParser.table_ref_aux_return table_ref_aux77 =null;

        PLSQLParser_PLSQL_DMLParser.query_partition_clause_return query_partition_clause78 =null;

        PLSQLParser_PLSQL_DMLParser.join_on_part_return join_on_part79 =null;

        PLSQLParser_PLSQL_DMLParser.join_using_part_return join_using_part80 =null;


        RewriteRuleSubtreeStream stream_inner_key=new RewriteRuleSubtreeStream(adaptor,"rule inner_key");
        RewriteRuleSubtreeStream stream_join_using_part=new RewriteRuleSubtreeStream(adaptor,"rule join_using_part");
        RewriteRuleSubtreeStream stream_join_on_part=new RewriteRuleSubtreeStream(adaptor,"rule join_on_part");
        RewriteRuleSubtreeStream stream_join_key=new RewriteRuleSubtreeStream(adaptor,"rule join_key");
        RewriteRuleSubtreeStream stream_outer_join_type=new RewriteRuleSubtreeStream(adaptor,"rule outer_join_type");
        RewriteRuleSubtreeStream stream_query_partition_clause=new RewriteRuleSubtreeStream(adaptor,"rule query_partition_clause");
        RewriteRuleSubtreeStream stream_cross_key=new RewriteRuleSubtreeStream(adaptor,"rule cross_key");
        RewriteRuleSubtreeStream stream_natural_key=new RewriteRuleSubtreeStream(adaptor,"rule natural_key");
        RewriteRuleSubtreeStream stream_table_ref_aux=new RewriteRuleSubtreeStream(adaptor,"rule table_ref_aux");
        try {
            // PLSQL_DMLParser.g:262:5: ( ( query_partition_clause )? ( cross_key | natural_key )? ( inner_key | outer_join_type )? join_key table_ref_aux ( query_partition_clause )? ( join_on_part | join_using_part )? -> ^( JOIN_DEF[$join_key.start] ( cross_key )? ( natural_key )? ( inner_key )? ( outer_join_type )? table_ref_aux ( query_partition_clause )* ( join_on_part )? ( join_using_part )? ) )
            // PLSQL_DMLParser.g:262:10: ( query_partition_clause )? ( cross_key | natural_key )? ( inner_key | outer_join_type )? join_key table_ref_aux ( query_partition_clause )? ( join_on_part | join_using_part )?
            {
            // PLSQL_DMLParser.g:262:10: ( query_partition_clause )?
            int alt28=2;
            int LA28_0 = input.LA(1);

            if ( (LA28_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("natural"))||(input.LT(1).getText().equalsIgnoreCase("join"))||(input.LT(1).getText().equalsIgnoreCase("inner"))||(input.LT(1).getText().equalsIgnoreCase("left"))||(input.LT(1).getText().equalsIgnoreCase("full"))||(input.LT(1).getText().equalsIgnoreCase("right"))||(input.LT(1).getText().equalsIgnoreCase("partition"))||(input.LT(1).getText().equalsIgnoreCase("cross"))))) {
                int LA28_1 = input.LA(2);

                if ( (LA28_1==SQL92_RESERVED_BY) && ((input.LT(1).getText().equalsIgnoreCase("partition")))) {
                    alt28=1;
                }
            }
            switch (alt28) {
                case 1 :
                    // PLSQL_DMLParser.g:262:10: query_partition_clause
                    {
                    pushFollow(FOLLOW_query_partition_clause_in_join_clause1569);
                    query_partition_clause71=query_partition_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_query_partition_clause.add(query_partition_clause71.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:263:9: ( cross_key | natural_key )?
            int alt29=3;
            int LA29_0 = input.LA(1);

            if ( (LA29_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("natural"))||(input.LT(1).getText().equalsIgnoreCase("join"))||(input.LT(1).getText().equalsIgnoreCase("left"))||(input.LT(1).getText().equalsIgnoreCase("inner"))||(input.LT(1).getText().equalsIgnoreCase("full"))||(input.LT(1).getText().equalsIgnoreCase("right"))||(input.LT(1).getText().equalsIgnoreCase("cross"))))) {
                int LA29_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("cross"))) ) {
                    alt29=1;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("natural"))) ) {
                    alt29=2;
                }
            }
            switch (alt29) {
                case 1 :
                    // PLSQL_DMLParser.g:263:10: cross_key
                    {
                    pushFollow(FOLLOW_cross_key_in_join_clause1581);
                    cross_key72=gPLSQLParser.cross_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_cross_key.add(cross_key72.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:263:20: natural_key
                    {
                    pushFollow(FOLLOW_natural_key_in_join_clause1583);
                    natural_key73=gPLSQLParser.natural_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_natural_key.add(natural_key73.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:263:34: ( inner_key | outer_join_type )?
            int alt30=3;
            int LA30_0 = input.LA(1);

            if ( (LA30_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("join"))||(input.LT(1).getText().equalsIgnoreCase("inner"))||(input.LT(1).getText().equalsIgnoreCase("left"))||(input.LT(1).getText().equalsIgnoreCase("full"))||(input.LT(1).getText().equalsIgnoreCase("right"))))) {
                int LA30_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("inner"))) ) {
                    alt30=1;
                }
                else if ( (((input.LT(1).getText().equalsIgnoreCase("left"))||(input.LT(1).getText().equalsIgnoreCase("full"))||(input.LT(1).getText().equalsIgnoreCase("right")))) ) {
                    alt30=2;
                }
            }
            switch (alt30) {
                case 1 :
                    // PLSQL_DMLParser.g:263:35: inner_key
                    {
                    pushFollow(FOLLOW_inner_key_in_join_clause1588);
                    inner_key74=gPLSQLParser.inner_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_inner_key.add(inner_key74.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:263:45: outer_join_type
                    {
                    pushFollow(FOLLOW_outer_join_type_in_join_clause1590);
                    outer_join_type75=outer_join_type();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_outer_join_type.add(outer_join_type75.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_join_key_in_join_clause1594);
            join_key76=gPLSQLParser.join_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_join_key.add(join_key76.getTree());

            pushFollow(FOLLOW_table_ref_aux_in_join_clause1604);
            table_ref_aux77=table_ref_aux();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_table_ref_aux.add(table_ref_aux77.getTree());

            // PLSQL_DMLParser.g:265:9: ( query_partition_clause )?
            int alt31=2;
            int LA31_0 = input.LA(1);

            if ( (LA31_0==REGULAR_ID) ) {
                int LA31_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("partition"))) ) {
                    alt31=1;
                }
            }
            switch (alt31) {
                case 1 :
                    // PLSQL_DMLParser.g:265:9: query_partition_clause
                    {
                    pushFollow(FOLLOW_query_partition_clause_in_join_clause1614);
                    query_partition_clause78=query_partition_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_query_partition_clause.add(query_partition_clause78.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:266:5: ( join_on_part | join_using_part )?
            int alt32=3;
            int LA32_0 = input.LA(1);

            if ( (LA32_0==SQL92_RESERVED_ON) ) {
                alt32=1;
            }
            else if ( (LA32_0==PLSQL_NON_RESERVED_USING) ) {
                alt32=2;
            }
            switch (alt32) {
                case 1 :
                    // PLSQL_DMLParser.g:266:10: join_on_part
                    {
                    pushFollow(FOLLOW_join_on_part_in_join_clause1626);
                    join_on_part79=join_on_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_join_on_part.add(join_on_part79.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:267:10: join_using_part
                    {
                    pushFollow(FOLLOW_join_using_part_in_join_clause1637);
                    join_using_part80=join_using_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_join_using_part.add(join_using_part80.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: join_using_part, join_on_part, cross_key, outer_join_type, inner_key, query_partition_clause, table_ref_aux, natural_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 269:9: -> ^( JOIN_DEF[$join_key.start] ( cross_key )? ( natural_key )? ( inner_key )? ( outer_join_type )? table_ref_aux ( query_partition_clause )* ( join_on_part )? ( join_using_part )? )
            {
                // PLSQL_DMLParser.g:269:12: ^( JOIN_DEF[$join_key.start] ( cross_key )? ( natural_key )? ( inner_key )? ( outer_join_type )? table_ref_aux ( query_partition_clause )* ( join_on_part )? ( join_using_part )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(JOIN_DEF, (join_key76!=null?((Token)join_key76.start):null))
                , root_1);

                // PLSQL_DMLParser.g:269:40: ( cross_key )?
                if ( stream_cross_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_cross_key.nextTree());

                }
                stream_cross_key.reset();

                // PLSQL_DMLParser.g:269:51: ( natural_key )?
                if ( stream_natural_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_natural_key.nextTree());

                }
                stream_natural_key.reset();

                // PLSQL_DMLParser.g:269:64: ( inner_key )?
                if ( stream_inner_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_inner_key.nextTree());

                }
                stream_inner_key.reset();

                // PLSQL_DMLParser.g:269:75: ( outer_join_type )?
                if ( stream_outer_join_type.hasNext() ) {
                    adaptor.addChild(root_1, stream_outer_join_type.nextTree());

                }
                stream_outer_join_type.reset();

                adaptor.addChild(root_1, stream_table_ref_aux.nextTree());

                // PLSQL_DMLParser.g:269:106: ( query_partition_clause )*
                while ( stream_query_partition_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_query_partition_clause.nextTree());

                }
                stream_query_partition_clause.reset();

                // PLSQL_DMLParser.g:269:130: ( join_on_part )?
                if ( stream_join_on_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_join_on_part.nextTree());

                }
                stream_join_on_part.reset();

                // PLSQL_DMLParser.g:269:144: ( join_using_part )?
                if ( stream_join_using_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_join_using_part.nextTree());

                }
                stream_join_using_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "join_clause"


    public static class join_on_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "join_on_part"
    // PLSQL_DMLParser.g:272:1: join_on_part : on_key condition -> ^( on_key ^( LOGIC_EXPR condition ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.join_on_part_return join_on_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.join_on_part_return retval = new PLSQLParser_PLSQL_DMLParser.join_on_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.on_key_return on_key81 =null;

        PLSQLParser_PLSQL_DMLParser.condition_return condition82 =null;


        RewriteRuleSubtreeStream stream_condition=new RewriteRuleSubtreeStream(adaptor,"rule condition");
        RewriteRuleSubtreeStream stream_on_key=new RewriteRuleSubtreeStream(adaptor,"rule on_key");
        try {
            // PLSQL_DMLParser.g:273:5: ( on_key condition -> ^( on_key ^( LOGIC_EXPR condition ) ) )
            // PLSQL_DMLParser.g:273:10: on_key condition
            {
            pushFollow(FOLLOW_on_key_in_join_on_part1703);
            on_key81=gPLSQLParser.on_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_on_key.add(on_key81.getTree());

            pushFollow(FOLLOW_condition_in_join_on_part1705);
            condition82=condition();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_condition.add(condition82.getTree());

            // AST REWRITE
            // elements: on_key, condition
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 274:9: -> ^( on_key ^( LOGIC_EXPR condition ) )
            {
                // PLSQL_DMLParser.g:274:12: ^( on_key ^( LOGIC_EXPR condition ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_on_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:274:21: ^( LOGIC_EXPR condition )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(LOGIC_EXPR, "LOGIC_EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_condition.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "join_on_part"


    public static class join_using_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "join_using_part"
    // PLSQL_DMLParser.g:277:1: join_using_part : using_key ^ LEFT_PAREN ! column_name ( COMMA ! column_name )* RIGHT_PAREN !;
    public final PLSQLParser_PLSQL_DMLParser.join_using_part_return join_using_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.join_using_part_return retval = new PLSQLParser_PLSQL_DMLParser.join_using_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN84=null;
        Token COMMA86=null;
        Token RIGHT_PAREN88=null;
        PLSQLParser_PLSQLKeys.using_key_return using_key83 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name85 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name87 =null;


        Object LEFT_PAREN84_tree=null;
        Object COMMA86_tree=null;
        Object RIGHT_PAREN88_tree=null;

        try {
            // PLSQL_DMLParser.g:278:5: ( using_key ^ LEFT_PAREN ! column_name ( COMMA ! column_name )* RIGHT_PAREN !)
            // PLSQL_DMLParser.g:278:10: using_key ^ LEFT_PAREN ! column_name ( COMMA ! column_name )* RIGHT_PAREN !
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_using_key_in_join_using_part1746);
            using_key83=gPLSQLParser.using_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(using_key83.getTree(), root_0);

            LEFT_PAREN84=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_join_using_part1749); if (state.failed) return retval;

            pushFollow(FOLLOW_column_name_in_join_using_part1752);
            column_name85=gPLSQLParser.column_name();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, column_name85.getTree());

            // PLSQL_DMLParser.g:278:45: ( COMMA ! column_name )*
            loop33:
            do {
                int alt33=2;
                int LA33_0 = input.LA(1);

                if ( (LA33_0==COMMA) ) {
                    alt33=1;
                }


                switch (alt33) {
            	case 1 :
            	    // PLSQL_DMLParser.g:278:46: COMMA ! column_name
            	    {
            	    COMMA86=(Token)match(input,COMMA,FOLLOW_COMMA_in_join_using_part1755); if (state.failed) return retval;

            	    pushFollow(FOLLOW_column_name_in_join_using_part1758);
            	    column_name87=gPLSQLParser.column_name();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, column_name87.getTree());

            	    }
            	    break;

            	default :
            	    break loop33;
                }
            } while (true);


            RIGHT_PAREN88=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_join_using_part1762); if (state.failed) return retval;

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "join_using_part"


    public static class outer_join_type_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "outer_join_type"
    // PLSQL_DMLParser.g:281:1: outer_join_type : ( full_key | left_key | right_key ) ( outer_key !)? ;
    public final PLSQLParser_PLSQL_DMLParser.outer_join_type_return outer_join_type() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.outer_join_type_return retval = new PLSQLParser_PLSQL_DMLParser.outer_join_type_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.full_key_return full_key89 =null;

        PLSQLParser_PLSQLKeys.left_key_return left_key90 =null;

        PLSQLParser_PLSQLKeys.right_key_return right_key91 =null;

        PLSQLParser_PLSQLKeys.outer_key_return outer_key92 =null;



        try {
            // PLSQL_DMLParser.g:282:5: ( ( full_key | left_key | right_key ) ( outer_key !)? )
            // PLSQL_DMLParser.g:283:5: ( full_key | left_key | right_key ) ( outer_key !)?
            {
            root_0 = (Object)adaptor.nil();


            // PLSQL_DMLParser.g:283:5: ( full_key | left_key | right_key )
            int alt34=3;
            int LA34_0 = input.LA(1);

            if ( (LA34_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("left"))||(input.LT(1).getText().equalsIgnoreCase("full"))||(input.LT(1).getText().equalsIgnoreCase("right"))))) {
                int LA34_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("full"))) ) {
                    alt34=1;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("left"))) ) {
                    alt34=2;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("right"))) ) {
                    alt34=3;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 34, 1, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 34, 0, input);

                throw nvae;

            }
            switch (alt34) {
                case 1 :
                    // PLSQL_DMLParser.g:283:10: full_key
                    {
                    pushFollow(FOLLOW_full_key_in_outer_join_type1793);
                    full_key89=gPLSQLParser.full_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, full_key89.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:284:10: left_key
                    {
                    pushFollow(FOLLOW_left_key_in_outer_join_type1804);
                    left_key90=gPLSQLParser.left_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, left_key90.getTree());

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:285:10: right_key
                    {
                    pushFollow(FOLLOW_right_key_in_outer_join_type1815);
                    right_key91=gPLSQLParser.right_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, right_key91.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:287:18: ( outer_key !)?
            int alt35=2;
            int LA35_0 = input.LA(1);

            if ( (LA35_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("join"))||(input.LT(1).getText().equalsIgnoreCase("outer"))))) {
                int LA35_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("outer"))) ) {
                    alt35=1;
                }
            }
            switch (alt35) {
                case 1 :
                    // PLSQL_DMLParser.g:287:18: outer_key !
                    {
                    pushFollow(FOLLOW_outer_key_in_outer_join_type1831);
                    outer_key92=gPLSQLParser.outer_key();

                    state._fsp--;
                    if (state.failed) return retval;

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "outer_join_type"


    public static class query_partition_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "query_partition_clause"
    // PLSQL_DMLParser.g:290:1: query_partition_clause : partition_key by_key ( ( LEFT_PAREN )=> expression_list | expression ( COMMA expression )* ) -> ^( partition_key ( expression_list )? ( EXPR expression )* ) ;
    public final PLSQLParser_PLSQL_DMLParser.query_partition_clause_return query_partition_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.query_partition_clause_return retval = new PLSQLParser_PLSQL_DMLParser.query_partition_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COMMA97=null;
        PLSQLParser_PLSQLKeys.partition_key_return partition_key93 =null;

        PLSQLParser_PLSQLKeys.by_key_return by_key94 =null;

        PLSQLParser_PLSQL_DMLParser.expression_list_return expression_list95 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression96 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression98 =null;


        Object COMMA97_tree=null;
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_expression_list=new RewriteRuleSubtreeStream(adaptor,"rule expression_list");
        RewriteRuleSubtreeStream stream_partition_key=new RewriteRuleSubtreeStream(adaptor,"rule partition_key");
        RewriteRuleSubtreeStream stream_by_key=new RewriteRuleSubtreeStream(adaptor,"rule by_key");
        try {
            // PLSQL_DMLParser.g:291:5: ( partition_key by_key ( ( LEFT_PAREN )=> expression_list | expression ( COMMA expression )* ) -> ^( partition_key ( expression_list )? ( EXPR expression )* ) )
            // PLSQL_DMLParser.g:291:10: partition_key by_key ( ( LEFT_PAREN )=> expression_list | expression ( COMMA expression )* )
            {
            pushFollow(FOLLOW_partition_key_in_query_partition_clause1853);
            partition_key93=gPLSQLParser.partition_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_partition_key.add(partition_key93.getTree());

            pushFollow(FOLLOW_by_key_in_query_partition_clause1855);
            by_key94=gPLSQLParser.by_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_by_key.add(by_key94.getTree());

            // PLSQL_DMLParser.g:292:5: ( ( LEFT_PAREN )=> expression_list | expression ( COMMA expression )* )
            int alt37=2;
            int LA37_0 = input.LA(1);

            if ( (LA37_0==LEFT_PAREN) ) {
                int LA37_1 = input.LA(2);

                if ( (synpred4_PLSQL_DMLParser()) ) {
                    alt37=1;
                }
                else if ( (true) ) {
                    alt37=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 37, 1, input);

                    throw nvae;

                }
            }
            else if ( (LA37_0==APPROXIMATE_NUM_LIT||(LA37_0 >= CHAR_STRING && LA37_0 <= COLON)||LA37_0==DELIMITED_ID||LA37_0==EXACT_NUM_LIT||LA37_0==INTRODUCER||LA37_0==MINUS_SIGN||LA37_0==PLUS_SIGN||LA37_0==REGULAR_ID||LA37_0==SQL92_RESERVED_ALL||LA37_0==SQL92_RESERVED_ANY||LA37_0==SQL92_RESERVED_CASE||LA37_0==SQL92_RESERVED_DEFAULT||LA37_0==SQL92_RESERVED_DISTINCT||(LA37_0 >= SQL92_RESERVED_EXISTS && LA37_0 <= SQL92_RESERVED_FALSE)||(LA37_0 >= SQL92_RESERVED_NOT && LA37_0 <= SQL92_RESERVED_NULL)||LA37_0==SQL92_RESERVED_PRIOR||LA37_0==SQL92_RESERVED_TRUE||LA37_0==UNSIGNED_INTEGER) ) {
                alt37=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 37, 0, input);

                throw nvae;

            }
            switch (alt37) {
                case 1 :
                    // PLSQL_DMLParser.g:292:10: ( LEFT_PAREN )=> expression_list
                    {
                    pushFollow(FOLLOW_expression_list_in_query_partition_clause1871);
                    expression_list95=expression_list();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression_list.add(expression_list95.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:293:10: expression ( COMMA expression )*
                    {
                    pushFollow(FOLLOW_expression_in_query_partition_clause1882);
                    expression96=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(expression96.getTree());

                    // PLSQL_DMLParser.g:293:21: ( COMMA expression )*
                    loop36:
                    do {
                        int alt36=2;
                        int LA36_0 = input.LA(1);

                        if ( (LA36_0==COMMA) ) {
                            alt36=1;
                        }


                        switch (alt36) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:293:22: COMMA expression
                    	    {
                    	    COMMA97=(Token)match(input,COMMA,FOLLOW_COMMA_in_query_partition_clause1885); if (state.failed) return retval; 
                    	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA97);


                    	    pushFollow(FOLLOW_expression_in_query_partition_clause1887);
                    	    expression98=expression();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_expression.add(expression98.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop36;
                        }
                    } while (true);


                    }
                    break;

            }


            // AST REWRITE
            // elements: expression, expression_list, partition_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 295:9: -> ^( partition_key ( expression_list )? ( EXPR expression )* )
            {
                // PLSQL_DMLParser.g:295:12: ^( partition_key ( expression_list )? ( EXPR expression )* )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_partition_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:295:28: ( expression_list )?
                if ( stream_expression_list.hasNext() ) {
                    adaptor.addChild(root_1, stream_expression_list.nextTree());

                }
                stream_expression_list.reset();

                // PLSQL_DMLParser.g:295:45: ( EXPR expression )*
                while ( stream_expression.hasNext() ) {
                    adaptor.addChild(root_1, 
                    (Object)adaptor.create(EXPR, "EXPR")
                    );

                    adaptor.addChild(root_1, stream_expression.nextTree());

                }
                stream_expression.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "query_partition_clause"


    public static class flashback_query_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "flashback_query_clause"
    // PLSQL_DMLParser.g:298:1: flashback_query_clause : ( versions_key between_key ( scn_key | timestamp_key ) expression -> ^( versions_key ( scn_key )? ( timestamp_key )? ^( EXPR expression ) ) | as_key of_key ( scn_key | timestamp_key ) expression -> ^( as_key ( scn_key )? ( timestamp_key )? ^( EXPR expression ) ) );
    public final PLSQLParser_PLSQL_DMLParser.flashback_query_clause_return flashback_query_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.flashback_query_clause_return retval = new PLSQLParser_PLSQL_DMLParser.flashback_query_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.versions_key_return versions_key99 =null;

        PLSQLParser_PLSQLKeys.between_key_return between_key100 =null;

        PLSQLParser_PLSQLKeys.scn_key_return scn_key101 =null;

        PLSQLParser_PLSQLKeys.timestamp_key_return timestamp_key102 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression103 =null;

        PLSQLParser_PLSQLKeys.as_key_return as_key104 =null;

        PLSQLParser_PLSQLKeys.of_key_return of_key105 =null;

        PLSQLParser_PLSQLKeys.scn_key_return scn_key106 =null;

        PLSQLParser_PLSQLKeys.timestamp_key_return timestamp_key107 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression108 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_scn_key=new RewriteRuleSubtreeStream(adaptor,"rule scn_key");
        RewriteRuleSubtreeStream stream_versions_key=new RewriteRuleSubtreeStream(adaptor,"rule versions_key");
        RewriteRuleSubtreeStream stream_between_key=new RewriteRuleSubtreeStream(adaptor,"rule between_key");
        RewriteRuleSubtreeStream stream_as_key=new RewriteRuleSubtreeStream(adaptor,"rule as_key");
        RewriteRuleSubtreeStream stream_timestamp_key=new RewriteRuleSubtreeStream(adaptor,"rule timestamp_key");
        RewriteRuleSubtreeStream stream_of_key=new RewriteRuleSubtreeStream(adaptor,"rule of_key");
        try {
            // PLSQL_DMLParser.g:299:5: ( versions_key between_key ( scn_key | timestamp_key ) expression -> ^( versions_key ( scn_key )? ( timestamp_key )? ^( EXPR expression ) ) | as_key of_key ( scn_key | timestamp_key ) expression -> ^( as_key ( scn_key )? ( timestamp_key )? ^( EXPR expression ) ) )
            int alt40=2;
            int LA40_0 = input.LA(1);

            if ( (LA40_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("versions")))) {
                alt40=1;
            }
            else if ( (LA40_0==SQL92_RESERVED_AS) ) {
                alt40=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 40, 0, input);

                throw nvae;

            }
            switch (alt40) {
                case 1 :
                    // PLSQL_DMLParser.g:299:10: versions_key between_key ( scn_key | timestamp_key ) expression
                    {
                    pushFollow(FOLLOW_versions_key_in_flashback_query_clause1939);
                    versions_key99=gPLSQLParser.versions_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_versions_key.add(versions_key99.getTree());

                    pushFollow(FOLLOW_between_key_in_flashback_query_clause1941);
                    between_key100=gPLSQLParser.between_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_between_key.add(between_key100.getTree());

                    // PLSQL_DMLParser.g:299:35: ( scn_key | timestamp_key )
                    int alt38=2;
                    int LA38_0 = input.LA(1);

                    if ( (LA38_0==REGULAR_ID) ) {
                        int LA38_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("scn"))) ) {
                            alt38=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("timestamp"))) ) {
                            alt38=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 38, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 38, 0, input);

                        throw nvae;

                    }
                    switch (alt38) {
                        case 1 :
                            // PLSQL_DMLParser.g:299:36: scn_key
                            {
                            pushFollow(FOLLOW_scn_key_in_flashback_query_clause1944);
                            scn_key101=gPLSQLParser.scn_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_scn_key.add(scn_key101.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:299:44: timestamp_key
                            {
                            pushFollow(FOLLOW_timestamp_key_in_flashback_query_clause1946);
                            timestamp_key102=gPLSQLParser.timestamp_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_timestamp_key.add(timestamp_key102.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_expression_in_flashback_query_clause1949);
                    expression103=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(expression103.getTree());

                    // AST REWRITE
                    // elements: timestamp_key, versions_key, expression, scn_key
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 299:70: -> ^( versions_key ( scn_key )? ( timestamp_key )? ^( EXPR expression ) )
                    {
                        // PLSQL_DMLParser.g:299:73: ^( versions_key ( scn_key )? ( timestamp_key )? ^( EXPR expression ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(stream_versions_key.nextNode(), root_1);

                        // PLSQL_DMLParser.g:299:88: ( scn_key )?
                        if ( stream_scn_key.hasNext() ) {
                            adaptor.addChild(root_1, stream_scn_key.nextTree());

                        }
                        stream_scn_key.reset();

                        // PLSQL_DMLParser.g:299:97: ( timestamp_key )?
                        if ( stream_timestamp_key.hasNext() ) {
                            adaptor.addChild(root_1, stream_timestamp_key.nextTree());

                        }
                        stream_timestamp_key.reset();

                        // PLSQL_DMLParser.g:299:112: ^( EXPR expression )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(EXPR, "EXPR")
                        , root_2);

                        adaptor.addChild(root_2, stream_expression.nextTree());

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:300:10: as_key of_key ( scn_key | timestamp_key ) expression
                    {
                    pushFollow(FOLLOW_as_key_in_flashback_query_clause1979);
                    as_key104=gPLSQLParser.as_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_as_key.add(as_key104.getTree());

                    pushFollow(FOLLOW_of_key_in_flashback_query_clause1981);
                    of_key105=gPLSQLParser.of_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_of_key.add(of_key105.getTree());

                    // PLSQL_DMLParser.g:300:24: ( scn_key | timestamp_key )
                    int alt39=2;
                    int LA39_0 = input.LA(1);

                    if ( (LA39_0==REGULAR_ID) ) {
                        int LA39_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("scn"))) ) {
                            alt39=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("timestamp"))) ) {
                            alt39=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 39, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 39, 0, input);

                        throw nvae;

                    }
                    switch (alt39) {
                        case 1 :
                            // PLSQL_DMLParser.g:300:25: scn_key
                            {
                            pushFollow(FOLLOW_scn_key_in_flashback_query_clause1984);
                            scn_key106=gPLSQLParser.scn_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_scn_key.add(scn_key106.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:300:33: timestamp_key
                            {
                            pushFollow(FOLLOW_timestamp_key_in_flashback_query_clause1986);
                            timestamp_key107=gPLSQLParser.timestamp_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_timestamp_key.add(timestamp_key107.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_expression_in_flashback_query_clause1989);
                    expression108=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(expression108.getTree());

                    // AST REWRITE
                    // elements: expression, timestamp_key, as_key, scn_key
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 300:59: -> ^( as_key ( scn_key )? ( timestamp_key )? ^( EXPR expression ) )
                    {
                        // PLSQL_DMLParser.g:300:62: ^( as_key ( scn_key )? ( timestamp_key )? ^( EXPR expression ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(stream_as_key.nextNode(), root_1);

                        // PLSQL_DMLParser.g:300:71: ( scn_key )?
                        if ( stream_scn_key.hasNext() ) {
                            adaptor.addChild(root_1, stream_scn_key.nextTree());

                        }
                        stream_scn_key.reset();

                        // PLSQL_DMLParser.g:300:80: ( timestamp_key )?
                        if ( stream_timestamp_key.hasNext() ) {
                            adaptor.addChild(root_1, stream_timestamp_key.nextTree());

                        }
                        stream_timestamp_key.reset();

                        // PLSQL_DMLParser.g:300:95: ^( EXPR expression )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(EXPR, "EXPR")
                        , root_2);

                        adaptor.addChild(root_2, stream_expression.nextTree());

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "flashback_query_clause"


    public static class pivot_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "pivot_clause"
    // PLSQL_DMLParser.g:303:1: pivot_clause : pivot_key ( xml_key )? LEFT_PAREN pivot_element ( COMMA pivot_element )* pivot_for_clause pivot_in_clause RIGHT_PAREN -> ^( pivot_key ( xml_key )? ( pivot_element )+ pivot_for_clause pivot_in_clause ) ;
    public final PLSQLParser_PLSQL_DMLParser.pivot_clause_return pivot_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.pivot_clause_return retval = new PLSQLParser_PLSQL_DMLParser.pivot_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN111=null;
        Token COMMA113=null;
        Token RIGHT_PAREN117=null;
        PLSQLParser_PLSQLKeys.pivot_key_return pivot_key109 =null;

        PLSQLParser_PLSQLKeys.xml_key_return xml_key110 =null;

        PLSQLParser_PLSQL_DMLParser.pivot_element_return pivot_element112 =null;

        PLSQLParser_PLSQL_DMLParser.pivot_element_return pivot_element114 =null;

        PLSQLParser_PLSQL_DMLParser.pivot_for_clause_return pivot_for_clause115 =null;

        PLSQLParser_PLSQL_DMLParser.pivot_in_clause_return pivot_in_clause116 =null;


        Object LEFT_PAREN111_tree=null;
        Object COMMA113_tree=null;
        Object RIGHT_PAREN117_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_pivot_in_clause=new RewriteRuleSubtreeStream(adaptor,"rule pivot_in_clause");
        RewriteRuleSubtreeStream stream_pivot_element=new RewriteRuleSubtreeStream(adaptor,"rule pivot_element");
        RewriteRuleSubtreeStream stream_pivot_key=new RewriteRuleSubtreeStream(adaptor,"rule pivot_key");
        RewriteRuleSubtreeStream stream_pivot_for_clause=new RewriteRuleSubtreeStream(adaptor,"rule pivot_for_clause");
        RewriteRuleSubtreeStream stream_xml_key=new RewriteRuleSubtreeStream(adaptor,"rule xml_key");
        try {
            // PLSQL_DMLParser.g:304:5: ( pivot_key ( xml_key )? LEFT_PAREN pivot_element ( COMMA pivot_element )* pivot_for_clause pivot_in_clause RIGHT_PAREN -> ^( pivot_key ( xml_key )? ( pivot_element )+ pivot_for_clause pivot_in_clause ) )
            // PLSQL_DMLParser.g:304:10: pivot_key ( xml_key )? LEFT_PAREN pivot_element ( COMMA pivot_element )* pivot_for_clause pivot_in_clause RIGHT_PAREN
            {
            pushFollow(FOLLOW_pivot_key_in_pivot_clause2027);
            pivot_key109=gPLSQLParser.pivot_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_pivot_key.add(pivot_key109.getTree());

            // PLSQL_DMLParser.g:304:20: ( xml_key )?
            int alt41=2;
            int LA41_0 = input.LA(1);

            if ( (LA41_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("xml")))) {
                alt41=1;
            }
            switch (alt41) {
                case 1 :
                    // PLSQL_DMLParser.g:304:20: xml_key
                    {
                    pushFollow(FOLLOW_xml_key_in_pivot_clause2029);
                    xml_key110=gPLSQLParser.xml_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_xml_key.add(xml_key110.getTree());

                    }
                    break;

            }


            LEFT_PAREN111=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_pivot_clause2040); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN111);


            pushFollow(FOLLOW_pivot_element_in_pivot_clause2054);
            pivot_element112=pivot_element();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_pivot_element.add(pivot_element112.getTree());

            // PLSQL_DMLParser.g:306:27: ( COMMA pivot_element )*
            loop42:
            do {
                int alt42=2;
                int LA42_0 = input.LA(1);

                if ( (LA42_0==COMMA) ) {
                    alt42=1;
                }


                switch (alt42) {
            	case 1 :
            	    // PLSQL_DMLParser.g:306:28: COMMA pivot_element
            	    {
            	    COMMA113=(Token)match(input,COMMA,FOLLOW_COMMA_in_pivot_clause2057); if (state.failed) return retval; 
            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA113);


            	    pushFollow(FOLLOW_pivot_element_in_pivot_clause2059);
            	    pivot_element114=pivot_element();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_pivot_element.add(pivot_element114.getTree());

            	    }
            	    break;

            	default :
            	    break loop42;
                }
            } while (true);


            pushFollow(FOLLOW_pivot_for_clause_in_pivot_clause2075);
            pivot_for_clause115=pivot_for_clause();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_pivot_for_clause.add(pivot_for_clause115.getTree());

            pushFollow(FOLLOW_pivot_in_clause_in_pivot_clause2089);
            pivot_in_clause116=pivot_in_clause();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_pivot_in_clause.add(pivot_in_clause116.getTree());

            RIGHT_PAREN117=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_pivot_clause2101); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN117);


            // AST REWRITE
            // elements: xml_key, pivot_key, pivot_in_clause, pivot_for_clause, pivot_element
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 310:9: -> ^( pivot_key ( xml_key )? ( pivot_element )+ pivot_for_clause pivot_in_clause )
            {
                // PLSQL_DMLParser.g:310:12: ^( pivot_key ( xml_key )? ( pivot_element )+ pivot_for_clause pivot_in_clause )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_pivot_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:310:24: ( xml_key )?
                if ( stream_xml_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_xml_key.nextTree());

                }
                stream_xml_key.reset();

                if ( !(stream_pivot_element.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_pivot_element.hasNext() ) {
                    adaptor.addChild(root_1, stream_pivot_element.nextTree());

                }
                stream_pivot_element.reset();

                adaptor.addChild(root_1, stream_pivot_for_clause.nextTree());

                adaptor.addChild(root_1, stream_pivot_in_clause.nextTree());

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "pivot_clause"


    public static class pivot_element_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "pivot_element"
    // PLSQL_DMLParser.g:313:1: pivot_element : aggregate_function_name LEFT_PAREN expression RIGHT_PAREN ( alias )? -> ^( PIVOT_ELEMENT ( alias )? ^( EXPR ^( ROUTINE_CALL aggregate_function_name ^( ARGUMENTS ^( ARGUMENT ^( EXPR expression ) ) ) ) ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.pivot_element_return pivot_element() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.pivot_element_return retval = new PLSQLParser_PLSQL_DMLParser.pivot_element_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN119=null;
        Token RIGHT_PAREN121=null;
        PLSQLParser_PLSQLCommons.aggregate_function_name_return aggregate_function_name118 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression120 =null;

        PLSQLParser_PLSQLCommons.alias_return alias122 =null;


        Object LEFT_PAREN119_tree=null;
        Object RIGHT_PAREN121_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_alias=new RewriteRuleSubtreeStream(adaptor,"rule alias");
        RewriteRuleSubtreeStream stream_aggregate_function_name=new RewriteRuleSubtreeStream(adaptor,"rule aggregate_function_name");
        try {
            // PLSQL_DMLParser.g:314:5: ( aggregate_function_name LEFT_PAREN expression RIGHT_PAREN ( alias )? -> ^( PIVOT_ELEMENT ( alias )? ^( EXPR ^( ROUTINE_CALL aggregate_function_name ^( ARGUMENTS ^( ARGUMENT ^( EXPR expression ) ) ) ) ) ) )
            // PLSQL_DMLParser.g:314:10: aggregate_function_name LEFT_PAREN expression RIGHT_PAREN ( alias )?
            {
            pushFollow(FOLLOW_aggregate_function_name_in_pivot_element2145);
            aggregate_function_name118=gPLSQLParser.aggregate_function_name();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_aggregate_function_name.add(aggregate_function_name118.getTree());

            LEFT_PAREN119=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_pivot_element2147); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN119);


            pushFollow(FOLLOW_expression_in_pivot_element2149);
            expression120=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression120.getTree());

            RIGHT_PAREN121=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_pivot_element2151); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN121);


            // PLSQL_DMLParser.g:314:68: ( alias )?
            int alt43=2;
            int LA43_0 = input.LA(1);

            if ( (LA43_0==CHAR_STRING||LA43_0==DELIMITED_ID||LA43_0==INTRODUCER||LA43_0==REGULAR_ID||LA43_0==SQL92_RESERVED_AS) ) {
                alt43=1;
            }
            switch (alt43) {
                case 1 :
                    // PLSQL_DMLParser.g:314:68: alias
                    {
                    pushFollow(FOLLOW_alias_in_pivot_element2153);
                    alias122=gPLSQLParser.alias();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_alias.add(alias122.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: expression, alias, aggregate_function_name
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 315:9: -> ^( PIVOT_ELEMENT ( alias )? ^( EXPR ^( ROUTINE_CALL aggregate_function_name ^( ARGUMENTS ^( ARGUMENT ^( EXPR expression ) ) ) ) ) )
            {
                // PLSQL_DMLParser.g:315:12: ^( PIVOT_ELEMENT ( alias )? ^( EXPR ^( ROUTINE_CALL aggregate_function_name ^( ARGUMENTS ^( ARGUMENT ^( EXPR expression ) ) ) ) ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(PIVOT_ELEMENT, "PIVOT_ELEMENT")
                , root_1);

                // PLSQL_DMLParser.g:315:28: ( alias )?
                if ( stream_alias.hasNext() ) {
                    adaptor.addChild(root_1, stream_alias.nextTree());

                }
                stream_alias.reset();

                // PLSQL_DMLParser.g:315:35: ^( EXPR ^( ROUTINE_CALL aggregate_function_name ^( ARGUMENTS ^( ARGUMENT ^( EXPR expression ) ) ) ) )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_2);

                // PLSQL_DMLParser.g:315:42: ^( ROUTINE_CALL aggregate_function_name ^( ARGUMENTS ^( ARGUMENT ^( EXPR expression ) ) ) )
                {
                Object root_3 = (Object)adaptor.nil();
                root_3 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(ROUTINE_CALL, "ROUTINE_CALL")
                , root_3);

                adaptor.addChild(root_3, stream_aggregate_function_name.nextTree());

                // PLSQL_DMLParser.g:315:81: ^( ARGUMENTS ^( ARGUMENT ^( EXPR expression ) ) )
                {
                Object root_4 = (Object)adaptor.nil();
                root_4 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(ARGUMENTS, "ARGUMENTS")
                , root_4);

                // PLSQL_DMLParser.g:315:93: ^( ARGUMENT ^( EXPR expression ) )
                {
                Object root_5 = (Object)adaptor.nil();
                root_5 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(ARGUMENT, "ARGUMENT")
                , root_5);

                // PLSQL_DMLParser.g:315:104: ^( EXPR expression )
                {
                Object root_6 = (Object)adaptor.nil();
                root_6 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_6);

                adaptor.addChild(root_6, stream_expression.nextTree());

                adaptor.addChild(root_5, root_6);
                }

                adaptor.addChild(root_4, root_5);
                }

                adaptor.addChild(root_3, root_4);
                }

                adaptor.addChild(root_2, root_3);
                }

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "pivot_element"


    public static class pivot_for_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "pivot_for_clause"
    // PLSQL_DMLParser.g:318:1: pivot_for_clause : for_key ( column_name | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN ) -> ^( for_key ( column_name )+ ) ;
    public final PLSQLParser_PLSQL_DMLParser.pivot_for_clause_return pivot_for_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.pivot_for_clause_return retval = new PLSQLParser_PLSQL_DMLParser.pivot_for_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN125=null;
        Token COMMA127=null;
        Token RIGHT_PAREN129=null;
        PLSQLParser_PLSQLKeys.for_key_return for_key123 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name124 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name126 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name128 =null;


        Object LEFT_PAREN125_tree=null;
        Object COMMA127_tree=null;
        Object RIGHT_PAREN129_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_column_name=new RewriteRuleSubtreeStream(adaptor,"rule column_name");
        RewriteRuleSubtreeStream stream_for_key=new RewriteRuleSubtreeStream(adaptor,"rule for_key");
        try {
            // PLSQL_DMLParser.g:319:5: ( for_key ( column_name | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN ) -> ^( for_key ( column_name )+ ) )
            // PLSQL_DMLParser.g:319:10: for_key ( column_name | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN )
            {
            pushFollow(FOLLOW_for_key_in_pivot_for_clause2215);
            for_key123=gPLSQLParser.for_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_for_key.add(for_key123.getTree());

            // PLSQL_DMLParser.g:320:5: ( column_name | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN )
            int alt45=2;
            int LA45_0 = input.LA(1);

            if ( (LA45_0==DELIMITED_ID||LA45_0==INTRODUCER||LA45_0==REGULAR_ID) ) {
                alt45=1;
            }
            else if ( (LA45_0==LEFT_PAREN) ) {
                alt45=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 45, 0, input);

                throw nvae;

            }
            switch (alt45) {
                case 1 :
                    // PLSQL_DMLParser.g:320:10: column_name
                    {
                    pushFollow(FOLLOW_column_name_in_pivot_for_clause2227);
                    column_name124=gPLSQLParser.column_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_column_name.add(column_name124.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:321:10: LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN
                    {
                    LEFT_PAREN125=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_pivot_for_clause2238); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN125);


                    pushFollow(FOLLOW_column_name_in_pivot_for_clause2240);
                    column_name126=gPLSQLParser.column_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_column_name.add(column_name126.getTree());

                    // PLSQL_DMLParser.g:321:33: ( COMMA column_name )*
                    loop44:
                    do {
                        int alt44=2;
                        int LA44_0 = input.LA(1);

                        if ( (LA44_0==COMMA) ) {
                            alt44=1;
                        }


                        switch (alt44) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:321:34: COMMA column_name
                    	    {
                    	    COMMA127=(Token)match(input,COMMA,FOLLOW_COMMA_in_pivot_for_clause2243); if (state.failed) return retval; 
                    	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA127);


                    	    pushFollow(FOLLOW_column_name_in_pivot_for_clause2245);
                    	    column_name128=gPLSQLParser.column_name();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_column_name.add(column_name128.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop44;
                        }
                    } while (true);


                    RIGHT_PAREN129=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_pivot_for_clause2249); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN129);


                    }
                    break;

            }


            // AST REWRITE
            // elements: column_name, for_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 323:9: -> ^( for_key ( column_name )+ )
            {
                // PLSQL_DMLParser.g:323:12: ^( for_key ( column_name )+ )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_for_key.nextNode(), root_1);

                if ( !(stream_column_name.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_column_name.hasNext() ) {
                    adaptor.addChild(root_1, stream_column_name.nextTree());

                }
                stream_column_name.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "pivot_for_clause"


    public static class pivot_in_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "pivot_in_clause"
    // PLSQL_DMLParser.g:326:1: pivot_in_clause : in_key LEFT_PAREN ( ( select_key )=> subquery | ( any_key )=> any_key ( COMMA any_key )* | pivot_in_clause_element ( COMMA pivot_in_clause_element )* ) RIGHT_PAREN -> {mode == 1}? ^( in_key subquery ) -> {mode == 2}? ^( in_key ^( ANY_MODE ( any_key )+ ) ) -> ^( in_key ^( ELEMENTS_MODE ( pivot_in_clause_element )+ ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.pivot_in_clause_return pivot_in_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.pivot_in_clause_return retval = new PLSQLParser_PLSQL_DMLParser.pivot_in_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN131=null;
        Token COMMA134=null;
        Token COMMA137=null;
        Token RIGHT_PAREN139=null;
        PLSQLParser_PLSQLKeys.in_key_return in_key130 =null;

        PLSQLParser_PLSQL_DMLParser.subquery_return subquery132 =null;

        PLSQLParser_PLSQLKeys.any_key_return any_key133 =null;

        PLSQLParser_PLSQLKeys.any_key_return any_key135 =null;

        PLSQLParser_PLSQL_DMLParser.pivot_in_clause_element_return pivot_in_clause_element136 =null;

        PLSQLParser_PLSQL_DMLParser.pivot_in_clause_element_return pivot_in_clause_element138 =null;


        Object LEFT_PAREN131_tree=null;
        Object COMMA134_tree=null;
        Object COMMA137_tree=null;
        Object RIGHT_PAREN139_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_any_key=new RewriteRuleSubtreeStream(adaptor,"rule any_key");
        RewriteRuleSubtreeStream stream_pivot_in_clause_element=new RewriteRuleSubtreeStream(adaptor,"rule pivot_in_clause_element");
        RewriteRuleSubtreeStream stream_in_key=new RewriteRuleSubtreeStream(adaptor,"rule in_key");
        RewriteRuleSubtreeStream stream_subquery=new RewriteRuleSubtreeStream(adaptor,"rule subquery");
            int mode = 0;    
        try {
            // PLSQL_DMLParser.g:328:5: ( in_key LEFT_PAREN ( ( select_key )=> subquery | ( any_key )=> any_key ( COMMA any_key )* | pivot_in_clause_element ( COMMA pivot_in_clause_element )* ) RIGHT_PAREN -> {mode == 1}? ^( in_key subquery ) -> {mode == 2}? ^( in_key ^( ANY_MODE ( any_key )+ ) ) -> ^( in_key ^( ELEMENTS_MODE ( pivot_in_clause_element )+ ) ) )
            // PLSQL_DMLParser.g:328:10: in_key LEFT_PAREN ( ( select_key )=> subquery | ( any_key )=> any_key ( COMMA any_key )* | pivot_in_clause_element ( COMMA pivot_in_clause_element )* ) RIGHT_PAREN
            {
            pushFollow(FOLLOW_in_key_in_pivot_in_clause2300);
            in_key130=gPLSQLParser.in_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_in_key.add(in_key130.getTree());

            LEFT_PAREN131=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_pivot_in_clause2310); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN131);


            // PLSQL_DMLParser.g:330:13: ( ( select_key )=> subquery | ( any_key )=> any_key ( COMMA any_key )* | pivot_in_clause_element ( COMMA pivot_in_clause_element )* )
            int alt48=3;
            int LA48_0 = input.LA(1);

            if ( (LA48_0==SQL92_RESERVED_SELECT) && (synpred5_PLSQL_DMLParser())) {
                alt48=1;
            }
            else if ( (LA48_0==LEFT_PAREN) ) {
                int LA48_2 = input.LA(2);

                if ( (synpred5_PLSQL_DMLParser()) ) {
                    alt48=1;
                }
                else if ( (true) ) {
                    alt48=3;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 48, 2, input);

                    throw nvae;

                }
            }
            else if ( (LA48_0==SQL92_RESERVED_ANY) ) {
                int LA48_3 = input.LA(2);

                if ( (synpred6_PLSQL_DMLParser()) ) {
                    alt48=2;
                }
                else if ( (true) ) {
                    alt48=3;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 48, 3, input);

                    throw nvae;

                }
            }
            else if ( (LA48_0==APPROXIMATE_NUM_LIT||(LA48_0 >= CHAR_STRING && LA48_0 <= COLON)||LA48_0==DELIMITED_ID||LA48_0==EXACT_NUM_LIT||LA48_0==INTRODUCER||LA48_0==MINUS_SIGN||LA48_0==PLUS_SIGN||LA48_0==REGULAR_ID||LA48_0==SQL92_RESERVED_ALL||LA48_0==SQL92_RESERVED_CASE||LA48_0==SQL92_RESERVED_DEFAULT||LA48_0==SQL92_RESERVED_DISTINCT||(LA48_0 >= SQL92_RESERVED_EXISTS && LA48_0 <= SQL92_RESERVED_FALSE)||(LA48_0 >= SQL92_RESERVED_NOT && LA48_0 <= SQL92_RESERVED_NULL)||LA48_0==SQL92_RESERVED_PRIOR||LA48_0==SQL92_RESERVED_TRUE||LA48_0==UNSIGNED_INTEGER) ) {
                alt48=3;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 48, 0, input);

                throw nvae;

            }
            switch (alt48) {
                case 1 :
                    // PLSQL_DMLParser.g:330:18: ( select_key )=> subquery
                    {
                    pushFollow(FOLLOW_subquery_in_pivot_in_clause2334);
                    subquery132=subquery();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_subquery.add(subquery132.getTree());

                    if ( state.backtracking==0 ) {mode = 1;}

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:331:18: ( any_key )=> any_key ( COMMA any_key )*
                    {
                    pushFollow(FOLLOW_any_key_in_pivot_in_clause2360);
                    any_key133=gPLSQLParser.any_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_any_key.add(any_key133.getTree());

                    // PLSQL_DMLParser.g:331:38: ( COMMA any_key )*
                    loop46:
                    do {
                        int alt46=2;
                        int LA46_0 = input.LA(1);

                        if ( (LA46_0==COMMA) ) {
                            alt46=1;
                        }


                        switch (alt46) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:331:39: COMMA any_key
                    	    {
                    	    COMMA134=(Token)match(input,COMMA,FOLLOW_COMMA_in_pivot_in_clause2363); if (state.failed) return retval; 
                    	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA134);


                    	    pushFollow(FOLLOW_any_key_in_pivot_in_clause2365);
                    	    any_key135=gPLSQLParser.any_key();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_any_key.add(any_key135.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop46;
                        }
                    } while (true);


                    if ( state.backtracking==0 ) {mode = 1;}

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:332:18: pivot_in_clause_element ( COMMA pivot_in_clause_element )*
                    {
                    pushFollow(FOLLOW_pivot_in_clause_element_in_pivot_in_clause2388);
                    pivot_in_clause_element136=pivot_in_clause_element();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_pivot_in_clause_element.add(pivot_in_clause_element136.getTree());

                    // PLSQL_DMLParser.g:332:42: ( COMMA pivot_in_clause_element )*
                    loop47:
                    do {
                        int alt47=2;
                        int LA47_0 = input.LA(1);

                        if ( (LA47_0==COMMA) ) {
                            alt47=1;
                        }


                        switch (alt47) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:332:43: COMMA pivot_in_clause_element
                    	    {
                    	    COMMA137=(Token)match(input,COMMA,FOLLOW_COMMA_in_pivot_in_clause2391); if (state.failed) return retval; 
                    	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA137);


                    	    pushFollow(FOLLOW_pivot_in_clause_element_in_pivot_in_clause2393);
                    	    pivot_in_clause_element138=pivot_in_clause_element();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_pivot_in_clause_element.add(pivot_in_clause_element138.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop47;
                        }
                    } while (true);


                    }
                    break;

            }


            RIGHT_PAREN139=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_pivot_in_clause2419); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN139);


            // AST REWRITE
            // elements: subquery, pivot_in_clause_element, any_key, in_key, in_key, in_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 335:9: -> {mode == 1}? ^( in_key subquery )
            if (mode == 1) {
                // PLSQL_DMLParser.g:335:24: ^( in_key subquery )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_in_key.nextNode(), root_1);

                adaptor.addChild(root_1, stream_subquery.nextTree());

                adaptor.addChild(root_0, root_1);
                }

            }

            else // 336:9: -> {mode == 2}? ^( in_key ^( ANY_MODE ( any_key )+ ) )
            if (mode == 2) {
                // PLSQL_DMLParser.g:336:24: ^( in_key ^( ANY_MODE ( any_key )+ ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_in_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:336:33: ^( ANY_MODE ( any_key )+ )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(ANY_MODE, "ANY_MODE")
                , root_2);

                if ( !(stream_any_key.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_any_key.hasNext() ) {
                    adaptor.addChild(root_2, stream_any_key.nextTree());

                }
                stream_any_key.reset();

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }

            else // 337:9: -> ^( in_key ^( ELEMENTS_MODE ( pivot_in_clause_element )+ ) )
            {
                // PLSQL_DMLParser.g:337:12: ^( in_key ^( ELEMENTS_MODE ( pivot_in_clause_element )+ ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_in_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:337:21: ^( ELEMENTS_MODE ( pivot_in_clause_element )+ )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(ELEMENTS_MODE, "ELEMENTS_MODE")
                , root_2);

                if ( !(stream_pivot_in_clause_element.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_pivot_in_clause_element.hasNext() ) {
                    adaptor.addChild(root_2, stream_pivot_in_clause_element.nextTree());

                }
                stream_pivot_in_clause_element.reset();

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "pivot_in_clause"


    public static class pivot_in_clause_element_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "pivot_in_clause_element"
    // PLSQL_DMLParser.g:340:1: pivot_in_clause_element : pivot_in_clause_elements ( alias )? -> ^( PIVOT_IN_ELEMENT ( alias )? pivot_in_clause_elements ) ;
    public final PLSQLParser_PLSQL_DMLParser.pivot_in_clause_element_return pivot_in_clause_element() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.pivot_in_clause_element_return retval = new PLSQLParser_PLSQL_DMLParser.pivot_in_clause_element_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.pivot_in_clause_elements_return pivot_in_clause_elements140 =null;

        PLSQLParser_PLSQLCommons.alias_return alias141 =null;


        RewriteRuleSubtreeStream stream_alias=new RewriteRuleSubtreeStream(adaptor,"rule alias");
        RewriteRuleSubtreeStream stream_pivot_in_clause_elements=new RewriteRuleSubtreeStream(adaptor,"rule pivot_in_clause_elements");
        try {
            // PLSQL_DMLParser.g:341:5: ( pivot_in_clause_elements ( alias )? -> ^( PIVOT_IN_ELEMENT ( alias )? pivot_in_clause_elements ) )
            // PLSQL_DMLParser.g:341:10: pivot_in_clause_elements ( alias )?
            {
            pushFollow(FOLLOW_pivot_in_clause_elements_in_pivot_in_clause_element2499);
            pivot_in_clause_elements140=pivot_in_clause_elements();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_pivot_in_clause_elements.add(pivot_in_clause_elements140.getTree());

            // PLSQL_DMLParser.g:341:35: ( alias )?
            int alt49=2;
            int LA49_0 = input.LA(1);

            if ( (LA49_0==CHAR_STRING||LA49_0==DELIMITED_ID||LA49_0==INTRODUCER||LA49_0==REGULAR_ID||LA49_0==SQL92_RESERVED_AS) ) {
                alt49=1;
            }
            switch (alt49) {
                case 1 :
                    // PLSQL_DMLParser.g:341:35: alias
                    {
                    pushFollow(FOLLOW_alias_in_pivot_in_clause_element2501);
                    alias141=gPLSQLParser.alias();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_alias.add(alias141.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: alias, pivot_in_clause_elements
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 342:9: -> ^( PIVOT_IN_ELEMENT ( alias )? pivot_in_clause_elements )
            {
                // PLSQL_DMLParser.g:342:12: ^( PIVOT_IN_ELEMENT ( alias )? pivot_in_clause_elements )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(PIVOT_IN_ELEMENT, "PIVOT_IN_ELEMENT")
                , root_1);

                // PLSQL_DMLParser.g:342:31: ( alias )?
                if ( stream_alias.hasNext() ) {
                    adaptor.addChild(root_1, stream_alias.nextTree());

                }
                stream_alias.reset();

                adaptor.addChild(root_1, stream_pivot_in_clause_elements.nextTree());

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "pivot_in_clause_element"


    public static class pivot_in_clause_elements_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "pivot_in_clause_elements"
    // PLSQL_DMLParser.g:345:1: pivot_in_clause_elements : ( expression -> ^( EXPR expression ) | ( LEFT_PAREN )=> expression_list );
    public final PLSQLParser_PLSQL_DMLParser.pivot_in_clause_elements_return pivot_in_clause_elements() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.pivot_in_clause_elements_return retval = new PLSQLParser_PLSQL_DMLParser.pivot_in_clause_elements_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression142 =null;

        PLSQLParser_PLSQL_DMLParser.expression_list_return expression_list143 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        try {
            // PLSQL_DMLParser.g:346:5: ( expression -> ^( EXPR expression ) | ( LEFT_PAREN )=> expression_list )
            int alt50=2;
            int LA50_0 = input.LA(1);

            if ( (LA50_0==APPROXIMATE_NUM_LIT||(LA50_0 >= CHAR_STRING && LA50_0 <= COLON)||LA50_0==DELIMITED_ID||LA50_0==EXACT_NUM_LIT||LA50_0==INTRODUCER||LA50_0==MINUS_SIGN||LA50_0==PLUS_SIGN||LA50_0==REGULAR_ID||LA50_0==SQL92_RESERVED_ALL||LA50_0==SQL92_RESERVED_ANY||LA50_0==SQL92_RESERVED_CASE||LA50_0==SQL92_RESERVED_DEFAULT||LA50_0==SQL92_RESERVED_DISTINCT||(LA50_0 >= SQL92_RESERVED_EXISTS && LA50_0 <= SQL92_RESERVED_FALSE)||(LA50_0 >= SQL92_RESERVED_NOT && LA50_0 <= SQL92_RESERVED_NULL)||LA50_0==SQL92_RESERVED_PRIOR||LA50_0==SQL92_RESERVED_TRUE||LA50_0==UNSIGNED_INTEGER) ) {
                alt50=1;
            }
            else if ( (LA50_0==LEFT_PAREN) ) {
                int LA50_20 = input.LA(2);

                if ( (true) ) {
                    alt50=1;
                }
                else if ( (synpred7_PLSQL_DMLParser()) ) {
                    alt50=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 50, 20, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 50, 0, input);

                throw nvae;

            }
            switch (alt50) {
                case 1 :
                    // PLSQL_DMLParser.g:346:10: expression
                    {
                    pushFollow(FOLLOW_expression_in_pivot_in_clause_elements2541);
                    expression142=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(expression142.getTree());

                    // AST REWRITE
                    // elements: expression
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 346:21: -> ^( EXPR expression )
                    {
                        // PLSQL_DMLParser.g:346:24: ^( EXPR expression )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(EXPR, "EXPR")
                        , root_1);

                        adaptor.addChild(root_1, stream_expression.nextTree());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:347:10: ( LEFT_PAREN )=> expression_list
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_expression_list_in_pivot_in_clause_elements2565);
                    expression_list143=expression_list();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_list143.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "pivot_in_clause_elements"


    public static class unpivot_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "unpivot_clause"
    // PLSQL_DMLParser.g:350:1: unpivot_clause : unpivot_key ( ( include_key | exclude_key ) nulls_key )? LEFT_PAREN ( column_name | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN ) pivot_for_clause unpivot_in_clause RIGHT_PAREN -> ^( unpivot_key ( include_key )? ( exclude_key )? ( nulls_key )? ( column_name )+ pivot_for_clause unpivot_in_clause ) ;
    public final PLSQLParser_PLSQL_DMLParser.unpivot_clause_return unpivot_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.unpivot_clause_return retval = new PLSQLParser_PLSQL_DMLParser.unpivot_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN148=null;
        Token LEFT_PAREN150=null;
        Token COMMA152=null;
        Token RIGHT_PAREN154=null;
        Token RIGHT_PAREN157=null;
        PLSQLParser_PLSQLKeys.unpivot_key_return unpivot_key144 =null;

        PLSQLParser_PLSQLKeys.include_key_return include_key145 =null;

        PLSQLParser_PLSQLKeys.exclude_key_return exclude_key146 =null;

        PLSQLParser_PLSQLKeys.nulls_key_return nulls_key147 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name149 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name151 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name153 =null;

        PLSQLParser_PLSQL_DMLParser.pivot_for_clause_return pivot_for_clause155 =null;

        PLSQLParser_PLSQL_DMLParser.unpivot_in_clause_return unpivot_in_clause156 =null;


        Object LEFT_PAREN148_tree=null;
        Object LEFT_PAREN150_tree=null;
        Object COMMA152_tree=null;
        Object RIGHT_PAREN154_tree=null;
        Object RIGHT_PAREN157_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_nulls_key=new RewriteRuleSubtreeStream(adaptor,"rule nulls_key");
        RewriteRuleSubtreeStream stream_exclude_key=new RewriteRuleSubtreeStream(adaptor,"rule exclude_key");
        RewriteRuleSubtreeStream stream_include_key=new RewriteRuleSubtreeStream(adaptor,"rule include_key");
        RewriteRuleSubtreeStream stream_unpivot_key=new RewriteRuleSubtreeStream(adaptor,"rule unpivot_key");
        RewriteRuleSubtreeStream stream_pivot_for_clause=new RewriteRuleSubtreeStream(adaptor,"rule pivot_for_clause");
        RewriteRuleSubtreeStream stream_unpivot_in_clause=new RewriteRuleSubtreeStream(adaptor,"rule unpivot_in_clause");
        RewriteRuleSubtreeStream stream_column_name=new RewriteRuleSubtreeStream(adaptor,"rule column_name");
        try {
            // PLSQL_DMLParser.g:351:5: ( unpivot_key ( ( include_key | exclude_key ) nulls_key )? LEFT_PAREN ( column_name | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN ) pivot_for_clause unpivot_in_clause RIGHT_PAREN -> ^( unpivot_key ( include_key )? ( exclude_key )? ( nulls_key )? ( column_name )+ pivot_for_clause unpivot_in_clause ) )
            // PLSQL_DMLParser.g:351:10: unpivot_key ( ( include_key | exclude_key ) nulls_key )? LEFT_PAREN ( column_name | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN ) pivot_for_clause unpivot_in_clause RIGHT_PAREN
            {
            pushFollow(FOLLOW_unpivot_key_in_unpivot_clause2585);
            unpivot_key144=gPLSQLParser.unpivot_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_unpivot_key.add(unpivot_key144.getTree());

            // PLSQL_DMLParser.g:352:9: ( ( include_key | exclude_key ) nulls_key )?
            int alt52=2;
            int LA52_0 = input.LA(1);

            if ( (LA52_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("exclude"))||(input.LT(1).getText().equalsIgnoreCase("include"))))) {
                alt52=1;
            }
            switch (alt52) {
                case 1 :
                    // PLSQL_DMLParser.g:352:10: ( include_key | exclude_key ) nulls_key
                    {
                    // PLSQL_DMLParser.g:352:10: ( include_key | exclude_key )
                    int alt51=2;
                    int LA51_0 = input.LA(1);

                    if ( (LA51_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("exclude"))||(input.LT(1).getText().equalsIgnoreCase("include"))))) {
                        int LA51_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("include"))) ) {
                            alt51=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("exclude"))) ) {
                            alt51=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 51, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 51, 0, input);

                        throw nvae;

                    }
                    switch (alt51) {
                        case 1 :
                            // PLSQL_DMLParser.g:352:11: include_key
                            {
                            pushFollow(FOLLOW_include_key_in_unpivot_clause2598);
                            include_key145=gPLSQLParser.include_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_include_key.add(include_key145.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:352:23: exclude_key
                            {
                            pushFollow(FOLLOW_exclude_key_in_unpivot_clause2600);
                            exclude_key146=gPLSQLParser.exclude_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_exclude_key.add(exclude_key146.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_nulls_key_in_unpivot_clause2603);
                    nulls_key147=gPLSQLParser.nulls_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_nulls_key.add(nulls_key147.getTree());

                    }
                    break;

            }


            LEFT_PAREN148=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_unpivot_clause2615); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN148);


            // PLSQL_DMLParser.g:354:13: ( column_name | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN )
            int alt54=2;
            int LA54_0 = input.LA(1);

            if ( (LA54_0==DELIMITED_ID||LA54_0==INTRODUCER||LA54_0==REGULAR_ID) ) {
                alt54=1;
            }
            else if ( (LA54_0==LEFT_PAREN) ) {
                alt54=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 54, 0, input);

                throw nvae;

            }
            switch (alt54) {
                case 1 :
                    // PLSQL_DMLParser.g:354:18: column_name
                    {
                    pushFollow(FOLLOW_column_name_in_unpivot_clause2634);
                    column_name149=gPLSQLParser.column_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_column_name.add(column_name149.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:355:18: LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN
                    {
                    LEFT_PAREN150=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_unpivot_clause2653); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN150);


                    pushFollow(FOLLOW_column_name_in_unpivot_clause2655);
                    column_name151=gPLSQLParser.column_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_column_name.add(column_name151.getTree());

                    // PLSQL_DMLParser.g:355:41: ( COMMA column_name )*
                    loop53:
                    do {
                        int alt53=2;
                        int LA53_0 = input.LA(1);

                        if ( (LA53_0==COMMA) ) {
                            alt53=1;
                        }


                        switch (alt53) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:355:42: COMMA column_name
                    	    {
                    	    COMMA152=(Token)match(input,COMMA,FOLLOW_COMMA_in_unpivot_clause2658); if (state.failed) return retval; 
                    	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA152);


                    	    pushFollow(FOLLOW_column_name_in_unpivot_clause2660);
                    	    column_name153=gPLSQLParser.column_name();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_column_name.add(column_name153.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop53;
                        }
                    } while (true);


                    RIGHT_PAREN154=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_unpivot_clause2664); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN154);


                    }
                    break;

            }


            pushFollow(FOLLOW_pivot_for_clause_in_unpivot_clause2692);
            pivot_for_clause155=pivot_for_clause();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_pivot_for_clause.add(pivot_for_clause155.getTree());

            pushFollow(FOLLOW_unpivot_in_clause_in_unpivot_clause2706);
            unpivot_in_clause156=unpivot_in_clause();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_unpivot_in_clause.add(unpivot_in_clause156.getTree());

            RIGHT_PAREN157=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_unpivot_clause2716); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN157);


            // AST REWRITE
            // elements: unpivot_in_clause, include_key, nulls_key, exclude_key, pivot_for_clause, column_name, unpivot_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 360:9: -> ^( unpivot_key ( include_key )? ( exclude_key )? ( nulls_key )? ( column_name )+ pivot_for_clause unpivot_in_clause )
            {
                // PLSQL_DMLParser.g:360:12: ^( unpivot_key ( include_key )? ( exclude_key )? ( nulls_key )? ( column_name )+ pivot_for_clause unpivot_in_clause )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_unpivot_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:360:26: ( include_key )?
                if ( stream_include_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_include_key.nextTree());

                }
                stream_include_key.reset();

                // PLSQL_DMLParser.g:360:39: ( exclude_key )?
                if ( stream_exclude_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_exclude_key.nextTree());

                }
                stream_exclude_key.reset();

                // PLSQL_DMLParser.g:360:52: ( nulls_key )?
                if ( stream_nulls_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_nulls_key.nextTree());

                }
                stream_nulls_key.reset();

                if ( !(stream_column_name.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_column_name.hasNext() ) {
                    adaptor.addChild(root_1, stream_column_name.nextTree());

                }
                stream_column_name.reset();

                adaptor.addChild(root_1, stream_pivot_for_clause.nextTree());

                adaptor.addChild(root_1, stream_unpivot_in_clause.nextTree());

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "unpivot_clause"


    public static class unpivot_in_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "unpivot_in_clause"
    // PLSQL_DMLParser.g:363:1: unpivot_in_clause : in_key LEFT_PAREN unpivot_in_elements ( COMMA unpivot_in_elements )* RIGHT_PAREN -> ^( in_key ( ^( UNPIVOT_IN_ELEMENT unpivot_in_elements ) )+ ) ;
    public final PLSQLParser_PLSQL_DMLParser.unpivot_in_clause_return unpivot_in_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.unpivot_in_clause_return retval = new PLSQLParser_PLSQL_DMLParser.unpivot_in_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN159=null;
        Token COMMA161=null;
        Token RIGHT_PAREN163=null;
        PLSQLParser_PLSQLKeys.in_key_return in_key158 =null;

        PLSQLParser_PLSQL_DMLParser.unpivot_in_elements_return unpivot_in_elements160 =null;

        PLSQLParser_PLSQL_DMLParser.unpivot_in_elements_return unpivot_in_elements162 =null;


        Object LEFT_PAREN159_tree=null;
        Object COMMA161_tree=null;
        Object RIGHT_PAREN163_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_unpivot_in_elements=new RewriteRuleSubtreeStream(adaptor,"rule unpivot_in_elements");
        RewriteRuleSubtreeStream stream_in_key=new RewriteRuleSubtreeStream(adaptor,"rule in_key");
        try {
            // PLSQL_DMLParser.g:364:5: ( in_key LEFT_PAREN unpivot_in_elements ( COMMA unpivot_in_elements )* RIGHT_PAREN -> ^( in_key ( ^( UNPIVOT_IN_ELEMENT unpivot_in_elements ) )+ ) )
            // PLSQL_DMLParser.g:364:10: in_key LEFT_PAREN unpivot_in_elements ( COMMA unpivot_in_elements )* RIGHT_PAREN
            {
            pushFollow(FOLLOW_in_key_in_unpivot_in_clause2766);
            in_key158=gPLSQLParser.in_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_in_key.add(in_key158.getTree());

            LEFT_PAREN159=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_unpivot_in_clause2776); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN159);


            pushFollow(FOLLOW_unpivot_in_elements_in_unpivot_in_clause2790);
            unpivot_in_elements160=unpivot_in_elements();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_unpivot_in_elements.add(unpivot_in_elements160.getTree());

            // PLSQL_DMLParser.g:366:33: ( COMMA unpivot_in_elements )*
            loop55:
            do {
                int alt55=2;
                int LA55_0 = input.LA(1);

                if ( (LA55_0==COMMA) ) {
                    alt55=1;
                }


                switch (alt55) {
            	case 1 :
            	    // PLSQL_DMLParser.g:366:34: COMMA unpivot_in_elements
            	    {
            	    COMMA161=(Token)match(input,COMMA,FOLLOW_COMMA_in_unpivot_in_clause2793); if (state.failed) return retval; 
            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA161);


            	    pushFollow(FOLLOW_unpivot_in_elements_in_unpivot_in_clause2795);
            	    unpivot_in_elements162=unpivot_in_elements();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_unpivot_in_elements.add(unpivot_in_elements162.getTree());

            	    }
            	    break;

            	default :
            	    break loop55;
                }
            } while (true);


            RIGHT_PAREN163=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_unpivot_in_clause2807); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN163);


            // AST REWRITE
            // elements: in_key, unpivot_in_elements
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 368:9: -> ^( in_key ( ^( UNPIVOT_IN_ELEMENT unpivot_in_elements ) )+ )
            {
                // PLSQL_DMLParser.g:368:12: ^( in_key ( ^( UNPIVOT_IN_ELEMENT unpivot_in_elements ) )+ )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_in_key.nextNode(), root_1);

                if ( !(stream_unpivot_in_elements.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_unpivot_in_elements.hasNext() ) {
                    // PLSQL_DMLParser.g:368:21: ^( UNPIVOT_IN_ELEMENT unpivot_in_elements )
                    {
                    Object root_2 = (Object)adaptor.nil();
                    root_2 = (Object)adaptor.becomeRoot(
                    (Object)adaptor.create(UNPIVOT_IN_ELEMENT, "UNPIVOT_IN_ELEMENT")
                    , root_2);

                    adaptor.addChild(root_2, stream_unpivot_in_elements.nextTree());

                    adaptor.addChild(root_1, root_2);
                    }

                }
                stream_unpivot_in_elements.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "unpivot_in_clause"


    public static class unpivot_in_elements_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "unpivot_in_elements"
    // PLSQL_DMLParser.g:371:1: unpivot_in_elements : ( column_name | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN ) ( as_key )? ( expression_wrapper | ( LEFT_PAREN )=> expression_list ) -> ( column_name )+ ^( PIVOT_ALIAS ( expression_wrapper )? ( expression_list )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.unpivot_in_elements_return unpivot_in_elements() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.unpivot_in_elements_return retval = new PLSQLParser_PLSQL_DMLParser.unpivot_in_elements_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN165=null;
        Token COMMA167=null;
        Token RIGHT_PAREN169=null;
        PLSQLParser_PLSQLCommons.column_name_return column_name164 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name166 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name168 =null;

        PLSQLParser_PLSQLKeys.as_key_return as_key170 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper171 =null;

        PLSQLParser_PLSQL_DMLParser.expression_list_return expression_list172 =null;


        Object LEFT_PAREN165_tree=null;
        Object COMMA167_tree=null;
        Object RIGHT_PAREN169_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_expression_list=new RewriteRuleSubtreeStream(adaptor,"rule expression_list");
        RewriteRuleSubtreeStream stream_expression_wrapper=new RewriteRuleSubtreeStream(adaptor,"rule expression_wrapper");
        RewriteRuleSubtreeStream stream_as_key=new RewriteRuleSubtreeStream(adaptor,"rule as_key");
        RewriteRuleSubtreeStream stream_column_name=new RewriteRuleSubtreeStream(adaptor,"rule column_name");
        try {
            // PLSQL_DMLParser.g:372:5: ( ( column_name | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN ) ( as_key )? ( expression_wrapper | ( LEFT_PAREN )=> expression_list ) -> ( column_name )+ ^( PIVOT_ALIAS ( expression_wrapper )? ( expression_list )? ) )
            // PLSQL_DMLParser.g:372:10: ( column_name | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN ) ( as_key )? ( expression_wrapper | ( LEFT_PAREN )=> expression_list )
            {
            // PLSQL_DMLParser.g:372:10: ( column_name | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN )
            int alt57=2;
            int LA57_0 = input.LA(1);

            if ( (LA57_0==DELIMITED_ID||LA57_0==INTRODUCER||LA57_0==REGULAR_ID) ) {
                alt57=1;
            }
            else if ( (LA57_0==LEFT_PAREN) ) {
                alt57=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 57, 0, input);

                throw nvae;

            }
            switch (alt57) {
                case 1 :
                    // PLSQL_DMLParser.g:372:15: column_name
                    {
                    pushFollow(FOLLOW_column_name_in_unpivot_in_elements2853);
                    column_name164=gPLSQLParser.column_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_column_name.add(column_name164.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:373:14: LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN
                    {
                    LEFT_PAREN165=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_unpivot_in_elements2868); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN165);


                    pushFollow(FOLLOW_column_name_in_unpivot_in_elements2870);
                    column_name166=gPLSQLParser.column_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_column_name.add(column_name166.getTree());

                    // PLSQL_DMLParser.g:373:37: ( COMMA column_name )*
                    loop56:
                    do {
                        int alt56=2;
                        int LA56_0 = input.LA(1);

                        if ( (LA56_0==COMMA) ) {
                            alt56=1;
                        }


                        switch (alt56) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:373:38: COMMA column_name
                    	    {
                    	    COMMA167=(Token)match(input,COMMA,FOLLOW_COMMA_in_unpivot_in_elements2873); if (state.failed) return retval; 
                    	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA167);


                    	    pushFollow(FOLLOW_column_name_in_unpivot_in_elements2875);
                    	    column_name168=gPLSQLParser.column_name();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_column_name.add(column_name168.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop56;
                        }
                    } while (true);


                    RIGHT_PAREN169=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_unpivot_in_elements2879); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN169);


                    }
                    break;

            }


            // PLSQL_DMLParser.g:375:9: ( as_key )?
            int alt58=2;
            int LA58_0 = input.LA(1);

            if ( (LA58_0==SQL92_RESERVED_AS) ) {
                alt58=1;
            }
            switch (alt58) {
                case 1 :
                    // PLSQL_DMLParser.g:375:9: as_key
                    {
                    pushFollow(FOLLOW_as_key_in_unpivot_in_elements2899);
                    as_key170=gPLSQLParser.as_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_as_key.add(as_key170.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:376:9: ( expression_wrapper | ( LEFT_PAREN )=> expression_list )
            int alt59=2;
            int LA59_0 = input.LA(1);

            if ( (LA59_0==APPROXIMATE_NUM_LIT||(LA59_0 >= CHAR_STRING && LA59_0 <= COLON)||LA59_0==DELIMITED_ID||LA59_0==EXACT_NUM_LIT||LA59_0==INTRODUCER||LA59_0==MINUS_SIGN||LA59_0==PLUS_SIGN||LA59_0==REGULAR_ID||LA59_0==SQL92_RESERVED_ALL||LA59_0==SQL92_RESERVED_ANY||LA59_0==SQL92_RESERVED_CASE||LA59_0==SQL92_RESERVED_DEFAULT||LA59_0==SQL92_RESERVED_DISTINCT||(LA59_0 >= SQL92_RESERVED_EXISTS && LA59_0 <= SQL92_RESERVED_FALSE)||(LA59_0 >= SQL92_RESERVED_NOT && LA59_0 <= SQL92_RESERVED_NULL)||LA59_0==SQL92_RESERVED_PRIOR||LA59_0==SQL92_RESERVED_TRUE||LA59_0==UNSIGNED_INTEGER) ) {
                alt59=1;
            }
            else if ( (LA59_0==LEFT_PAREN) ) {
                int LA59_20 = input.LA(2);

                if ( (true) ) {
                    alt59=1;
                }
                else if ( (synpred8_PLSQL_DMLParser()) ) {
                    alt59=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 59, 20, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 59, 0, input);

                throw nvae;

            }
            switch (alt59) {
                case 1 :
                    // PLSQL_DMLParser.g:376:14: expression_wrapper
                    {
                    pushFollow(FOLLOW_expression_wrapper_in_unpivot_in_elements2915);
                    expression_wrapper171=expression_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression_wrapper.add(expression_wrapper171.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:377:14: ( LEFT_PAREN )=> expression_list
                    {
                    pushFollow(FOLLOW_expression_list_in_unpivot_in_elements2935);
                    expression_list172=expression_list();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression_list.add(expression_list172.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: expression_wrapper, expression_list, column_name
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 379:9: -> ( column_name )+ ^( PIVOT_ALIAS ( expression_wrapper )? ( expression_list )? )
            {
                if ( !(stream_column_name.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_column_name.hasNext() ) {
                    adaptor.addChild(root_0, stream_column_name.nextTree());

                }
                stream_column_name.reset();

                // PLSQL_DMLParser.g:379:25: ^( PIVOT_ALIAS ( expression_wrapper )? ( expression_list )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(PIVOT_ALIAS, "PIVOT_ALIAS")
                , root_1);

                // PLSQL_DMLParser.g:379:39: ( expression_wrapper )?
                if ( stream_expression_wrapper.hasNext() ) {
                    adaptor.addChild(root_1, stream_expression_wrapper.nextTree());

                }
                stream_expression_wrapper.reset();

                // PLSQL_DMLParser.g:379:59: ( expression_list )?
                if ( stream_expression_list.hasNext() ) {
                    adaptor.addChild(root_1, stream_expression_list.nextTree());

                }
                stream_expression_list.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "unpivot_in_elements"


    public static class hierarchical_query_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "hierarchical_query_clause"
    // PLSQL_DMLParser.g:382:1: hierarchical_query_clause : ( connect_key by_key ( nocycle_key )? condition ( start_part )? -> ^( HIERARCHICAL ( start_part )? ^( connect_key ( nocycle_key )? ^( LOGIC_EXPR condition ) ) ) | start_part connect_key by_key ( nocycle_key )? condition -> ^( HIERARCHICAL start_part ^( connect_key ( nocycle_key )? ^( LOGIC_EXPR condition ) ) ) );
    public final PLSQLParser_PLSQL_DMLParser.hierarchical_query_clause_return hierarchical_query_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.hierarchical_query_clause_return retval = new PLSQLParser_PLSQL_DMLParser.hierarchical_query_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.connect_key_return connect_key173 =null;

        PLSQLParser_PLSQLKeys.by_key_return by_key174 =null;

        PLSQLParser_PLSQLKeys.nocycle_key_return nocycle_key175 =null;

        PLSQLParser_PLSQL_DMLParser.condition_return condition176 =null;

        PLSQLParser_PLSQL_DMLParser.start_part_return start_part177 =null;

        PLSQLParser_PLSQL_DMLParser.start_part_return start_part178 =null;

        PLSQLParser_PLSQLKeys.connect_key_return connect_key179 =null;

        PLSQLParser_PLSQLKeys.by_key_return by_key180 =null;

        PLSQLParser_PLSQLKeys.nocycle_key_return nocycle_key181 =null;

        PLSQLParser_PLSQL_DMLParser.condition_return condition182 =null;


        RewriteRuleSubtreeStream stream_connect_key=new RewriteRuleSubtreeStream(adaptor,"rule connect_key");
        RewriteRuleSubtreeStream stream_condition=new RewriteRuleSubtreeStream(adaptor,"rule condition");
        RewriteRuleSubtreeStream stream_start_part=new RewriteRuleSubtreeStream(adaptor,"rule start_part");
        RewriteRuleSubtreeStream stream_by_key=new RewriteRuleSubtreeStream(adaptor,"rule by_key");
        RewriteRuleSubtreeStream stream_nocycle_key=new RewriteRuleSubtreeStream(adaptor,"rule nocycle_key");
        try {
            // PLSQL_DMLParser.g:383:5: ( connect_key by_key ( nocycle_key )? condition ( start_part )? -> ^( HIERARCHICAL ( start_part )? ^( connect_key ( nocycle_key )? ^( LOGIC_EXPR condition ) ) ) | start_part connect_key by_key ( nocycle_key )? condition -> ^( HIERARCHICAL start_part ^( connect_key ( nocycle_key )? ^( LOGIC_EXPR condition ) ) ) )
            int alt63=2;
            int LA63_0 = input.LA(1);

            if ( (LA63_0==SQL92_RESERVED_CONNECT) ) {
                alt63=1;
            }
            else if ( (LA63_0==PLSQL_RESERVED_START) ) {
                alt63=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 63, 0, input);

                throw nvae;

            }
            switch (alt63) {
                case 1 :
                    // PLSQL_DMLParser.g:383:10: connect_key by_key ( nocycle_key )? condition ( start_part )?
                    {
                    pushFollow(FOLLOW_connect_key_in_hierarchical_query_clause2988);
                    connect_key173=gPLSQLParser.connect_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_connect_key.add(connect_key173.getTree());

                    pushFollow(FOLLOW_by_key_in_hierarchical_query_clause2990);
                    by_key174=gPLSQLParser.by_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_by_key.add(by_key174.getTree());

                    // PLSQL_DMLParser.g:383:29: ( nocycle_key )?
                    int alt60=2;
                    int LA60_0 = input.LA(1);

                    if ( (LA60_0==REGULAR_ID) ) {
                        int LA60_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("nocycle"))) ) {
                            alt60=1;
                        }
                    }
                    switch (alt60) {
                        case 1 :
                            // PLSQL_DMLParser.g:383:29: nocycle_key
                            {
                            pushFollow(FOLLOW_nocycle_key_in_hierarchical_query_clause2992);
                            nocycle_key175=gPLSQLParser.nocycle_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_nocycle_key.add(nocycle_key175.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_condition_in_hierarchical_query_clause2995);
                    condition176=condition();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_condition.add(condition176.getTree());

                    // PLSQL_DMLParser.g:383:52: ( start_part )?
                    int alt61=2;
                    int LA61_0 = input.LA(1);

                    if ( (LA61_0==PLSQL_RESERVED_START) ) {
                        alt61=1;
                    }
                    switch (alt61) {
                        case 1 :
                            // PLSQL_DMLParser.g:383:52: start_part
                            {
                            pushFollow(FOLLOW_start_part_in_hierarchical_query_clause2997);
                            start_part177=start_part();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_start_part.add(start_part177.getTree());

                            }
                            break;

                    }


                    // AST REWRITE
                    // elements: nocycle_key, condition, connect_key, start_part
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 384:9: -> ^( HIERARCHICAL ( start_part )? ^( connect_key ( nocycle_key )? ^( LOGIC_EXPR condition ) ) )
                    {
                        // PLSQL_DMLParser.g:384:12: ^( HIERARCHICAL ( start_part )? ^( connect_key ( nocycle_key )? ^( LOGIC_EXPR condition ) ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(HIERARCHICAL, "HIERARCHICAL")
                        , root_1);

                        // PLSQL_DMLParser.g:384:27: ( start_part )?
                        if ( stream_start_part.hasNext() ) {
                            adaptor.addChild(root_1, stream_start_part.nextTree());

                        }
                        stream_start_part.reset();

                        // PLSQL_DMLParser.g:384:39: ^( connect_key ( nocycle_key )? ^( LOGIC_EXPR condition ) )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(stream_connect_key.nextNode(), root_2);

                        // PLSQL_DMLParser.g:384:53: ( nocycle_key )?
                        if ( stream_nocycle_key.hasNext() ) {
                            adaptor.addChild(root_2, stream_nocycle_key.nextTree());

                        }
                        stream_nocycle_key.reset();

                        // PLSQL_DMLParser.g:384:66: ^( LOGIC_EXPR condition )
                        {
                        Object root_3 = (Object)adaptor.nil();
                        root_3 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(LOGIC_EXPR, "LOGIC_EXPR")
                        , root_3);

                        adaptor.addChild(root_3, stream_condition.nextTree());

                        adaptor.addChild(root_2, root_3);
                        }

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:385:10: start_part connect_key by_key ( nocycle_key )? condition
                    {
                    pushFollow(FOLLOW_start_part_in_hierarchical_query_clause3039);
                    start_part178=start_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_start_part.add(start_part178.getTree());

                    pushFollow(FOLLOW_connect_key_in_hierarchical_query_clause3041);
                    connect_key179=gPLSQLParser.connect_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_connect_key.add(connect_key179.getTree());

                    pushFollow(FOLLOW_by_key_in_hierarchical_query_clause3043);
                    by_key180=gPLSQLParser.by_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_by_key.add(by_key180.getTree());

                    // PLSQL_DMLParser.g:385:40: ( nocycle_key )?
                    int alt62=2;
                    int LA62_0 = input.LA(1);

                    if ( (LA62_0==REGULAR_ID) ) {
                        int LA62_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("nocycle"))) ) {
                            alt62=1;
                        }
                    }
                    switch (alt62) {
                        case 1 :
                            // PLSQL_DMLParser.g:385:40: nocycle_key
                            {
                            pushFollow(FOLLOW_nocycle_key_in_hierarchical_query_clause3045);
                            nocycle_key181=gPLSQLParser.nocycle_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_nocycle_key.add(nocycle_key181.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_condition_in_hierarchical_query_clause3048);
                    condition182=condition();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_condition.add(condition182.getTree());

                    // AST REWRITE
                    // elements: connect_key, start_part, nocycle_key, condition
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 386:9: -> ^( HIERARCHICAL start_part ^( connect_key ( nocycle_key )? ^( LOGIC_EXPR condition ) ) )
                    {
                        // PLSQL_DMLParser.g:386:12: ^( HIERARCHICAL start_part ^( connect_key ( nocycle_key )? ^( LOGIC_EXPR condition ) ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(HIERARCHICAL, "HIERARCHICAL")
                        , root_1);

                        adaptor.addChild(root_1, stream_start_part.nextTree());

                        // PLSQL_DMLParser.g:386:38: ^( connect_key ( nocycle_key )? ^( LOGIC_EXPR condition ) )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(stream_connect_key.nextNode(), root_2);

                        // PLSQL_DMLParser.g:386:52: ( nocycle_key )?
                        if ( stream_nocycle_key.hasNext() ) {
                            adaptor.addChild(root_2, stream_nocycle_key.nextTree());

                        }
                        stream_nocycle_key.reset();

                        // PLSQL_DMLParser.g:386:65: ^( LOGIC_EXPR condition )
                        {
                        Object root_3 = (Object)adaptor.nil();
                        root_3 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(LOGIC_EXPR, "LOGIC_EXPR")
                        , root_3);

                        adaptor.addChild(root_3, stream_condition.nextTree());

                        adaptor.addChild(root_2, root_3);
                        }

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "hierarchical_query_clause"


    public static class start_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "start_part"
    // PLSQL_DMLParser.g:389:1: start_part : start_key with_key condition -> ^( start_key ^( LOGIC_EXPR condition ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.start_part_return start_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.start_part_return retval = new PLSQLParser_PLSQL_DMLParser.start_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.start_key_return start_key183 =null;

        PLSQLParser_PLSQLKeys.with_key_return with_key184 =null;

        PLSQLParser_PLSQL_DMLParser.condition_return condition185 =null;


        RewriteRuleSubtreeStream stream_start_key=new RewriteRuleSubtreeStream(adaptor,"rule start_key");
        RewriteRuleSubtreeStream stream_with_key=new RewriteRuleSubtreeStream(adaptor,"rule with_key");
        RewriteRuleSubtreeStream stream_condition=new RewriteRuleSubtreeStream(adaptor,"rule condition");
        try {
            // PLSQL_DMLParser.g:390:5: ( start_key with_key condition -> ^( start_key ^( LOGIC_EXPR condition ) ) )
            // PLSQL_DMLParser.g:390:10: start_key with_key condition
            {
            pushFollow(FOLLOW_start_key_in_start_part3097);
            start_key183=gPLSQLParser.start_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_start_key.add(start_key183.getTree());

            pushFollow(FOLLOW_with_key_in_start_part3099);
            with_key184=gPLSQLParser.with_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_with_key.add(with_key184.getTree());

            pushFollow(FOLLOW_condition_in_start_part3101);
            condition185=condition();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_condition.add(condition185.getTree());

            // AST REWRITE
            // elements: start_key, condition
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 391:9: -> ^( start_key ^( LOGIC_EXPR condition ) )
            {
                // PLSQL_DMLParser.g:391:12: ^( start_key ^( LOGIC_EXPR condition ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_start_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:391:24: ^( LOGIC_EXPR condition )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(LOGIC_EXPR, "LOGIC_EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_condition.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "start_part"


    public static class group_by_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "group_by_clause"
    // PLSQL_DMLParser.g:394:1: group_by_clause : group_key by_key group_by_elements ( ( COMMA group_by_elements )=> COMMA group_by_elements )* -> ^( group_key ( ^( GROUP_BY_ELEMENT group_by_elements ) )+ ) ;
    public final PLSQLParser_PLSQL_DMLParser.group_by_clause_return group_by_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.group_by_clause_return retval = new PLSQLParser_PLSQL_DMLParser.group_by_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COMMA189=null;
        PLSQLParser_PLSQLKeys.group_key_return group_key186 =null;

        PLSQLParser_PLSQLKeys.by_key_return by_key187 =null;

        PLSQLParser_PLSQL_DMLParser.group_by_elements_return group_by_elements188 =null;

        PLSQLParser_PLSQL_DMLParser.group_by_elements_return group_by_elements190 =null;


        Object COMMA189_tree=null;
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_group_key=new RewriteRuleSubtreeStream(adaptor,"rule group_key");
        RewriteRuleSubtreeStream stream_by_key=new RewriteRuleSubtreeStream(adaptor,"rule by_key");
        RewriteRuleSubtreeStream stream_group_by_elements=new RewriteRuleSubtreeStream(adaptor,"rule group_by_elements");
        try {
            // PLSQL_DMLParser.g:395:5: ( group_key by_key group_by_elements ( ( COMMA group_by_elements )=> COMMA group_by_elements )* -> ^( group_key ( ^( GROUP_BY_ELEMENT group_by_elements ) )+ ) )
            // PLSQL_DMLParser.g:395:10: group_key by_key group_by_elements ( ( COMMA group_by_elements )=> COMMA group_by_elements )*
            {
            pushFollow(FOLLOW_group_key_in_group_by_clause3141);
            group_key186=gPLSQLParser.group_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_group_key.add(group_key186.getTree());

            pushFollow(FOLLOW_by_key_in_group_by_clause3143);
            by_key187=gPLSQLParser.by_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_by_key.add(by_key187.getTree());

            pushFollow(FOLLOW_group_by_elements_in_group_by_clause3145);
            group_by_elements188=group_by_elements();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_group_by_elements.add(group_by_elements188.getTree());

            // PLSQL_DMLParser.g:395:45: ( ( COMMA group_by_elements )=> COMMA group_by_elements )*
            loop64:
            do {
                int alt64=2;
                int LA64_0 = input.LA(1);

                if ( (LA64_0==COMMA) ) {
                    int LA64_24 = input.LA(2);

                    if ( (synpred9_PLSQL_DMLParser()) ) {
                        alt64=1;
                    }


                }


                switch (alt64) {
            	case 1 :
            	    // PLSQL_DMLParser.g:395:46: ( COMMA group_by_elements )=> COMMA group_by_elements
            	    {
            	    COMMA189=(Token)match(input,COMMA,FOLLOW_COMMA_in_group_by_clause3155); if (state.failed) return retval; 
            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA189);


            	    pushFollow(FOLLOW_group_by_elements_in_group_by_clause3157);
            	    group_by_elements190=group_by_elements();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_group_by_elements.add(group_by_elements190.getTree());

            	    }
            	    break;

            	default :
            	    break loop64;
                }
            } while (true);


            // AST REWRITE
            // elements: group_key, group_by_elements
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 396:9: -> ^( group_key ( ^( GROUP_BY_ELEMENT group_by_elements ) )+ )
            {
                // PLSQL_DMLParser.g:396:12: ^( group_key ( ^( GROUP_BY_ELEMENT group_by_elements ) )+ )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_group_key.nextNode(), root_1);

                if ( !(stream_group_by_elements.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_group_by_elements.hasNext() ) {
                    // PLSQL_DMLParser.g:396:24: ^( GROUP_BY_ELEMENT group_by_elements )
                    {
                    Object root_2 = (Object)adaptor.nil();
                    root_2 = (Object)adaptor.becomeRoot(
                    (Object)adaptor.create(GROUP_BY_ELEMENT, "GROUP_BY_ELEMENT")
                    , root_2);

                    adaptor.addChild(root_2, stream_group_by_elements.nextTree());

                    adaptor.addChild(root_1, root_2);
                    }

                }
                stream_group_by_elements.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "group_by_clause"


    public static class group_by_elements_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "group_by_elements"
    // PLSQL_DMLParser.g:399:1: group_by_elements : ( grouping_sets_clause | rollup_cube_clause | expression -> ^( EXPR expression ) );
    public final PLSQLParser_PLSQL_DMLParser.group_by_elements_return group_by_elements() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.group_by_elements_return retval = new PLSQLParser_PLSQL_DMLParser.group_by_elements_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.grouping_sets_clause_return grouping_sets_clause191 =null;

        PLSQLParser_PLSQL_DMLParser.rollup_cube_clause_return rollup_cube_clause192 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression193 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        try {
            // PLSQL_DMLParser.g:400:5: ( grouping_sets_clause | rollup_cube_clause | expression -> ^( EXPR expression ) )
            int alt65=3;
            int LA65_0 = input.LA(1);

            if ( (LA65_0==REGULAR_ID) ) {
                int LA65_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("grouping"))) ) {
                    alt65=1;
                }
                else if ( (((input.LT(1).getText().equalsIgnoreCase("cube"))||(input.LT(1).getText().equalsIgnoreCase("rollup")))) ) {
                    alt65=2;
                }
                else if ( (true) ) {
                    alt65=3;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 65, 1, input);

                    throw nvae;

                }
            }
            else if ( (LA65_0==APPROXIMATE_NUM_LIT||(LA65_0 >= CHAR_STRING && LA65_0 <= COLON)||LA65_0==DELIMITED_ID||LA65_0==EXACT_NUM_LIT||LA65_0==INTRODUCER||LA65_0==LEFT_PAREN||LA65_0==MINUS_SIGN||LA65_0==PLUS_SIGN||LA65_0==SQL92_RESERVED_ALL||LA65_0==SQL92_RESERVED_ANY||LA65_0==SQL92_RESERVED_CASE||LA65_0==SQL92_RESERVED_DEFAULT||LA65_0==SQL92_RESERVED_DISTINCT||(LA65_0 >= SQL92_RESERVED_EXISTS && LA65_0 <= SQL92_RESERVED_FALSE)||(LA65_0 >= SQL92_RESERVED_NOT && LA65_0 <= SQL92_RESERVED_NULL)||LA65_0==SQL92_RESERVED_PRIOR||LA65_0==SQL92_RESERVED_TRUE||LA65_0==UNSIGNED_INTEGER) ) {
                alt65=3;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 65, 0, input);

                throw nvae;

            }
            switch (alt65) {
                case 1 :
                    // PLSQL_DMLParser.g:400:10: grouping_sets_clause
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_grouping_sets_clause_in_group_by_elements3200);
                    grouping_sets_clause191=grouping_sets_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, grouping_sets_clause191.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:401:10: rollup_cube_clause
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_rollup_cube_clause_in_group_by_elements3211);
                    rollup_cube_clause192=rollup_cube_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, rollup_cube_clause192.getTree());

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:402:10: expression
                    {
                    pushFollow(FOLLOW_expression_in_group_by_elements3223);
                    expression193=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(expression193.getTree());

                    // AST REWRITE
                    // elements: expression
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 402:21: -> ^( EXPR expression )
                    {
                        // PLSQL_DMLParser.g:402:24: ^( EXPR expression )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(EXPR, "EXPR")
                        , root_1);

                        adaptor.addChild(root_1, stream_expression.nextTree());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "group_by_elements"


    public static class rollup_cube_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "rollup_cube_clause"
    // PLSQL_DMLParser.g:405:1: rollup_cube_clause : ( rollup_key ^| cube_key ^) LEFT_PAREN ! grouping_sets_elements ( COMMA ! grouping_sets_elements )* RIGHT_PAREN !;
    public final PLSQLParser_PLSQL_DMLParser.rollup_cube_clause_return rollup_cube_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.rollup_cube_clause_return retval = new PLSQLParser_PLSQL_DMLParser.rollup_cube_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN196=null;
        Token COMMA198=null;
        Token RIGHT_PAREN200=null;
        PLSQLParser_PLSQLKeys.rollup_key_return rollup_key194 =null;

        PLSQLParser_PLSQLKeys.cube_key_return cube_key195 =null;

        PLSQLParser_PLSQL_DMLParser.grouping_sets_elements_return grouping_sets_elements197 =null;

        PLSQLParser_PLSQL_DMLParser.grouping_sets_elements_return grouping_sets_elements199 =null;


        Object LEFT_PAREN196_tree=null;
        Object COMMA198_tree=null;
        Object RIGHT_PAREN200_tree=null;

        try {
            // PLSQL_DMLParser.g:406:5: ( ( rollup_key ^| cube_key ^) LEFT_PAREN ! grouping_sets_elements ( COMMA ! grouping_sets_elements )* RIGHT_PAREN !)
            // PLSQL_DMLParser.g:406:10: ( rollup_key ^| cube_key ^) LEFT_PAREN ! grouping_sets_elements ( COMMA ! grouping_sets_elements )* RIGHT_PAREN !
            {
            root_0 = (Object)adaptor.nil();


            // PLSQL_DMLParser.g:406:10: ( rollup_key ^| cube_key ^)
            int alt66=2;
            int LA66_0 = input.LA(1);

            if ( (LA66_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("cube"))||(input.LT(1).getText().equalsIgnoreCase("rollup"))))) {
                int LA66_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("rollup"))) ) {
                    alt66=1;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("cube"))) ) {
                    alt66=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 66, 1, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 66, 0, input);

                throw nvae;

            }
            switch (alt66) {
                case 1 :
                    // PLSQL_DMLParser.g:406:11: rollup_key ^
                    {
                    pushFollow(FOLLOW_rollup_key_in_rollup_cube_clause3252);
                    rollup_key194=gPLSQLParser.rollup_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(rollup_key194.getTree(), root_0);

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:406:23: cube_key ^
                    {
                    pushFollow(FOLLOW_cube_key_in_rollup_cube_clause3255);
                    cube_key195=gPLSQLParser.cube_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(cube_key195.getTree(), root_0);

                    }
                    break;

            }


            LEFT_PAREN196=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_rollup_cube_clause3259); if (state.failed) return retval;

            pushFollow(FOLLOW_grouping_sets_elements_in_rollup_cube_clause3262);
            grouping_sets_elements197=grouping_sets_elements();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, grouping_sets_elements197.getTree());

            // PLSQL_DMLParser.g:406:69: ( COMMA ! grouping_sets_elements )*
            loop67:
            do {
                int alt67=2;
                int LA67_0 = input.LA(1);

                if ( (LA67_0==COMMA) ) {
                    alt67=1;
                }


                switch (alt67) {
            	case 1 :
            	    // PLSQL_DMLParser.g:406:70: COMMA ! grouping_sets_elements
            	    {
            	    COMMA198=(Token)match(input,COMMA,FOLLOW_COMMA_in_rollup_cube_clause3265); if (state.failed) return retval;

            	    pushFollow(FOLLOW_grouping_sets_elements_in_rollup_cube_clause3268);
            	    grouping_sets_elements199=grouping_sets_elements();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, grouping_sets_elements199.getTree());

            	    }
            	    break;

            	default :
            	    break loop67;
                }
            } while (true);


            RIGHT_PAREN200=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_rollup_cube_clause3272); if (state.failed) return retval;

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "rollup_cube_clause"


    public static class grouping_sets_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "grouping_sets_clause"
    // PLSQL_DMLParser.g:409:1: grouping_sets_clause : grouping_key sets_key LEFT_PAREN grouping_sets_elements ( COMMA grouping_sets_elements )* RIGHT_PAREN -> ^( grouping_key ( ^( GROUPIN_SET grouping_sets_elements ) )+ ) ;
    public final PLSQLParser_PLSQL_DMLParser.grouping_sets_clause_return grouping_sets_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.grouping_sets_clause_return retval = new PLSQLParser_PLSQL_DMLParser.grouping_sets_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN203=null;
        Token COMMA205=null;
        Token RIGHT_PAREN207=null;
        PLSQLParser_PLSQLKeys.grouping_key_return grouping_key201 =null;

        PLSQLParser_PLSQLKeys.sets_key_return sets_key202 =null;

        PLSQLParser_PLSQL_DMLParser.grouping_sets_elements_return grouping_sets_elements204 =null;

        PLSQLParser_PLSQL_DMLParser.grouping_sets_elements_return grouping_sets_elements206 =null;


        Object LEFT_PAREN203_tree=null;
        Object COMMA205_tree=null;
        Object RIGHT_PAREN207_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_grouping_key=new RewriteRuleSubtreeStream(adaptor,"rule grouping_key");
        RewriteRuleSubtreeStream stream_sets_key=new RewriteRuleSubtreeStream(adaptor,"rule sets_key");
        RewriteRuleSubtreeStream stream_grouping_sets_elements=new RewriteRuleSubtreeStream(adaptor,"rule grouping_sets_elements");
        try {
            // PLSQL_DMLParser.g:410:5: ( grouping_key sets_key LEFT_PAREN grouping_sets_elements ( COMMA grouping_sets_elements )* RIGHT_PAREN -> ^( grouping_key ( ^( GROUPIN_SET grouping_sets_elements ) )+ ) )
            // PLSQL_DMLParser.g:410:10: grouping_key sets_key LEFT_PAREN grouping_sets_elements ( COMMA grouping_sets_elements )* RIGHT_PAREN
            {
            pushFollow(FOLLOW_grouping_key_in_grouping_sets_clause3294);
            grouping_key201=gPLSQLParser.grouping_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_grouping_key.add(grouping_key201.getTree());

            pushFollow(FOLLOW_sets_key_in_grouping_sets_clause3296);
            sets_key202=gPLSQLParser.sets_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_sets_key.add(sets_key202.getTree());

            LEFT_PAREN203=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_grouping_sets_clause3307); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN203);


            pushFollow(FOLLOW_grouping_sets_elements_in_grouping_sets_clause3309);
            grouping_sets_elements204=grouping_sets_elements();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_grouping_sets_elements.add(grouping_sets_elements204.getTree());

            // PLSQL_DMLParser.g:411:43: ( COMMA grouping_sets_elements )*
            loop68:
            do {
                int alt68=2;
                int LA68_0 = input.LA(1);

                if ( (LA68_0==COMMA) ) {
                    alt68=1;
                }


                switch (alt68) {
            	case 1 :
            	    // PLSQL_DMLParser.g:411:44: COMMA grouping_sets_elements
            	    {
            	    COMMA205=(Token)match(input,COMMA,FOLLOW_COMMA_in_grouping_sets_clause3312); if (state.failed) return retval; 
            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA205);


            	    pushFollow(FOLLOW_grouping_sets_elements_in_grouping_sets_clause3314);
            	    grouping_sets_elements206=grouping_sets_elements();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_grouping_sets_elements.add(grouping_sets_elements206.getTree());

            	    }
            	    break;

            	default :
            	    break loop68;
                }
            } while (true);


            RIGHT_PAREN207=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_grouping_sets_clause3318); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN207);


            // AST REWRITE
            // elements: grouping_key, grouping_sets_elements
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 412:9: -> ^( grouping_key ( ^( GROUPIN_SET grouping_sets_elements ) )+ )
            {
                // PLSQL_DMLParser.g:412:12: ^( grouping_key ( ^( GROUPIN_SET grouping_sets_elements ) )+ )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_grouping_key.nextNode(), root_1);

                if ( !(stream_grouping_sets_elements.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_grouping_sets_elements.hasNext() ) {
                    // PLSQL_DMLParser.g:412:27: ^( GROUPIN_SET grouping_sets_elements )
                    {
                    Object root_2 = (Object)adaptor.nil();
                    root_2 = (Object)adaptor.becomeRoot(
                    (Object)adaptor.create(GROUPIN_SET, "GROUPIN_SET")
                    , root_2);

                    adaptor.addChild(root_2, stream_grouping_sets_elements.nextTree());

                    adaptor.addChild(root_1, root_2);
                    }

                }
                stream_grouping_sets_elements.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "grouping_sets_clause"


    public static class grouping_sets_elements_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "grouping_sets_elements"
    // PLSQL_DMLParser.g:415:1: grouping_sets_elements : ( ( rollup_key | cube_key )=> rollup_cube_clause | ( LEFT_PAREN )=> expression_list | expression -> ^( EXPR expression ) );
    public final PLSQLParser_PLSQL_DMLParser.grouping_sets_elements_return grouping_sets_elements() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.grouping_sets_elements_return retval = new PLSQLParser_PLSQL_DMLParser.grouping_sets_elements_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.rollup_cube_clause_return rollup_cube_clause208 =null;

        PLSQLParser_PLSQL_DMLParser.expression_list_return expression_list209 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression210 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        try {
            // PLSQL_DMLParser.g:416:5: ( ( rollup_key | cube_key )=> rollup_cube_clause | ( LEFT_PAREN )=> expression_list | expression -> ^( EXPR expression ) )
            int alt69=3;
            switch ( input.LA(1) ) {
            case REGULAR_ID:
                {
                int LA69_1 = input.LA(2);

                if ( (((((input.LT(1).getText().equalsIgnoreCase("cube"))||(input.LT(1).getText().equalsIgnoreCase("rollup")))&&((input.LT(1).getText().equalsIgnoreCase("cube"))||(input.LT(1).getText().equalsIgnoreCase("rollup"))))&&synpred10_PLSQL_DMLParser())) ) {
                    alt69=1;
                }
                else if ( (true) ) {
                    alt69=3;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 69, 1, input);

                    throw nvae;

                }
                }
                break;
            case LEFT_PAREN:
                {
                int LA69_2 = input.LA(2);

                if ( (synpred11_PLSQL_DMLParser()) ) {
                    alt69=2;
                }
                else if ( (true) ) {
                    alt69=3;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 69, 2, input);

                    throw nvae;

                }
                }
                break;
            case APPROXIMATE_NUM_LIT:
            case CHAR_STRING:
            case COLON:
            case DELIMITED_ID:
            case EXACT_NUM_LIT:
            case INTRODUCER:
            case MINUS_SIGN:
            case PLUS_SIGN:
            case SQL92_RESERVED_ALL:
            case SQL92_RESERVED_ANY:
            case SQL92_RESERVED_CASE:
            case SQL92_RESERVED_DEFAULT:
            case SQL92_RESERVED_DISTINCT:
            case SQL92_RESERVED_EXISTS:
            case SQL92_RESERVED_FALSE:
            case SQL92_RESERVED_NOT:
            case SQL92_RESERVED_NULL:
            case SQL92_RESERVED_PRIOR:
            case SQL92_RESERVED_TRUE:
            case UNSIGNED_INTEGER:
                {
                alt69=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 69, 0, input);

                throw nvae;

            }

            switch (alt69) {
                case 1 :
                    // PLSQL_DMLParser.g:416:10: ( rollup_key | cube_key )=> rollup_cube_clause
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_rollup_cube_clause_in_grouping_sets_elements3366);
                    rollup_cube_clause208=rollup_cube_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, rollup_cube_clause208.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:417:10: ( LEFT_PAREN )=> expression_list
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_expression_list_in_grouping_sets_elements3382);
                    expression_list209=expression_list();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_list209.getTree());

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:418:10: expression
                    {
                    pushFollow(FOLLOW_expression_in_grouping_sets_elements3393);
                    expression210=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(expression210.getTree());

                    // AST REWRITE
                    // elements: expression
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 418:21: -> ^( EXPR expression )
                    {
                        // PLSQL_DMLParser.g:418:24: ^( EXPR expression )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(EXPR, "EXPR")
                        , root_1);

                        adaptor.addChild(root_1, stream_expression.nextTree());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "grouping_sets_elements"


    public static class having_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "having_clause"
    // PLSQL_DMLParser.g:421:1: having_clause : having_key condition -> ^( having_key ^( LOGIC_EXPR condition ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.having_clause_return having_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.having_clause_return retval = new PLSQLParser_PLSQL_DMLParser.having_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.having_key_return having_key211 =null;

        PLSQLParser_PLSQL_DMLParser.condition_return condition212 =null;


        RewriteRuleSubtreeStream stream_having_key=new RewriteRuleSubtreeStream(adaptor,"rule having_key");
        RewriteRuleSubtreeStream stream_condition=new RewriteRuleSubtreeStream(adaptor,"rule condition");
        try {
            // PLSQL_DMLParser.g:422:5: ( having_key condition -> ^( having_key ^( LOGIC_EXPR condition ) ) )
            // PLSQL_DMLParser.g:422:10: having_key condition
            {
            pushFollow(FOLLOW_having_key_in_having_clause3421);
            having_key211=gPLSQLParser.having_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_having_key.add(having_key211.getTree());

            pushFollow(FOLLOW_condition_in_having_clause3423);
            condition212=condition();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_condition.add(condition212.getTree());

            // AST REWRITE
            // elements: condition, having_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 423:9: -> ^( having_key ^( LOGIC_EXPR condition ) )
            {
                // PLSQL_DMLParser.g:423:12: ^( having_key ^( LOGIC_EXPR condition ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_having_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:423:25: ^( LOGIC_EXPR condition )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(LOGIC_EXPR, "LOGIC_EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_condition.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "having_clause"


    public static class model_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "model_clause"
    // PLSQL_DMLParser.g:426:1: model_clause : model_key ( cell_reference_options )* ( return_rows_clause )? ( reference_model )* main_model -> ^( model_key main_model ( cell_reference_options )* ( return_rows_clause )? ( reference_model )* ) ;
    public final PLSQLParser_PLSQL_DMLParser.model_clause_return model_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.model_clause_return retval = new PLSQLParser_PLSQL_DMLParser.model_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.model_key_return model_key213 =null;

        PLSQLParser_PLSQL_DMLParser.cell_reference_options_return cell_reference_options214 =null;

        PLSQLParser_PLSQL_DMLParser.return_rows_clause_return return_rows_clause215 =null;

        PLSQLParser_PLSQL_DMLParser.reference_model_return reference_model216 =null;

        PLSQLParser_PLSQL_DMLParser.main_model_return main_model217 =null;


        RewriteRuleSubtreeStream stream_return_rows_clause=new RewriteRuleSubtreeStream(adaptor,"rule return_rows_clause");
        RewriteRuleSubtreeStream stream_model_key=new RewriteRuleSubtreeStream(adaptor,"rule model_key");
        RewriteRuleSubtreeStream stream_cell_reference_options=new RewriteRuleSubtreeStream(adaptor,"rule cell_reference_options");
        RewriteRuleSubtreeStream stream_reference_model=new RewriteRuleSubtreeStream(adaptor,"rule reference_model");
        RewriteRuleSubtreeStream stream_main_model=new RewriteRuleSubtreeStream(adaptor,"rule main_model");
        try {
            // PLSQL_DMLParser.g:427:5: ( model_key ( cell_reference_options )* ( return_rows_clause )? ( reference_model )* main_model -> ^( model_key main_model ( cell_reference_options )* ( return_rows_clause )? ( reference_model )* ) )
            // PLSQL_DMLParser.g:427:10: model_key ( cell_reference_options )* ( return_rows_clause )? ( reference_model )* main_model
            {
            pushFollow(FOLLOW_model_key_in_model_clause3463);
            model_key213=gPLSQLParser.model_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_model_key.add(model_key213.getTree());

            // PLSQL_DMLParser.g:427:20: ( cell_reference_options )*
            loop70:
            do {
                int alt70=2;
                int LA70_0 = input.LA(1);

                if ( (LA70_0==REGULAR_ID) ) {
                    int LA70_1 = input.LA(2);

                    if ( (LA70_1==REGULAR_ID) ) {
                        int LA70_3 = input.LA(3);

                        if ( (((input.LT(1).getText().equalsIgnoreCase("keep"))||(input.LT(1).getText().equalsIgnoreCase("ignore")))) ) {
                            alt70=1;
                        }


                    }


                }
                else if ( (LA70_0==SQL92_RESERVED_UNIQUE) ) {
                    alt70=1;
                }


                switch (alt70) {
            	case 1 :
            	    // PLSQL_DMLParser.g:427:20: cell_reference_options
            	    {
            	    pushFollow(FOLLOW_cell_reference_options_in_model_clause3465);
            	    cell_reference_options214=cell_reference_options();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_cell_reference_options.add(cell_reference_options214.getTree());

            	    }
            	    break;

            	default :
            	    break loop70;
                }
            } while (true);


            // PLSQL_DMLParser.g:427:44: ( return_rows_clause )?
            int alt71=2;
            int LA71_0 = input.LA(1);

            if ( (LA71_0==REGULAR_ID) ) {
                int LA71_1 = input.LA(2);

                if ( (LA71_1==REGULAR_ID) ) {
                    int LA71_2 = input.LA(3);

                    if ( (LA71_2==REGULAR_ID) ) {
                        int LA71_6 = input.LA(4);

                        if ( (LA71_6==REGULAR_ID) ) {
                            alt71=1;
                        }
                    }
                }
                else if ( (LA71_1==SQL92_RESERVED_ALL) ) {
                    alt71=1;
                }
            }
            switch (alt71) {
                case 1 :
                    // PLSQL_DMLParser.g:427:44: return_rows_clause
                    {
                    pushFollow(FOLLOW_return_rows_clause_in_model_clause3468);
                    return_rows_clause215=return_rows_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_return_rows_clause.add(return_rows_clause215.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:427:64: ( reference_model )*
            loop72:
            do {
                int alt72=2;
                alt72 = dfa72.predict(input);
                switch (alt72) {
            	case 1 :
            	    // PLSQL_DMLParser.g:427:64: reference_model
            	    {
            	    pushFollow(FOLLOW_reference_model_in_model_clause3471);
            	    reference_model216=reference_model();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_reference_model.add(reference_model216.getTree());

            	    }
            	    break;

            	default :
            	    break loop72;
                }
            } while (true);


            pushFollow(FOLLOW_main_model_in_model_clause3474);
            main_model217=main_model();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_main_model.add(main_model217.getTree());

            // AST REWRITE
            // elements: main_model, reference_model, model_key, return_rows_clause, cell_reference_options
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 428:9: -> ^( model_key main_model ( cell_reference_options )* ( return_rows_clause )? ( reference_model )* )
            {
                // PLSQL_DMLParser.g:428:12: ^( model_key main_model ( cell_reference_options )* ( return_rows_clause )? ( reference_model )* )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_model_key.nextNode(), root_1);

                adaptor.addChild(root_1, stream_main_model.nextTree());

                // PLSQL_DMLParser.g:428:35: ( cell_reference_options )*
                while ( stream_cell_reference_options.hasNext() ) {
                    adaptor.addChild(root_1, stream_cell_reference_options.nextTree());

                }
                stream_cell_reference_options.reset();

                // PLSQL_DMLParser.g:428:59: ( return_rows_clause )?
                if ( stream_return_rows_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_return_rows_clause.nextTree());

                }
                stream_return_rows_clause.reset();

                // PLSQL_DMLParser.g:428:79: ( reference_model )*
                while ( stream_reference_model.hasNext() ) {
                    adaptor.addChild(root_1, stream_reference_model.nextTree());

                }
                stream_reference_model.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "model_clause"


    public static class cell_reference_options_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "cell_reference_options"
    // PLSQL_DMLParser.g:431:1: cell_reference_options : ( ( ignore_key ^| keep_key ^) nav_key | unique_key ^ ( dimension_key | single_key reference_key !) );
    public final PLSQLParser_PLSQL_DMLParser.cell_reference_options_return cell_reference_options() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.cell_reference_options_return retval = new PLSQLParser_PLSQL_DMLParser.cell_reference_options_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.ignore_key_return ignore_key218 =null;

        PLSQLParser_PLSQLKeys.keep_key_return keep_key219 =null;

        PLSQLParser_PLSQLKeys.nav_key_return nav_key220 =null;

        PLSQLParser_PLSQLKeys.unique_key_return unique_key221 =null;

        PLSQLParser_PLSQLKeys.dimension_key_return dimension_key222 =null;

        PLSQLParser_PLSQLKeys.single_key_return single_key223 =null;

        PLSQLParser_PLSQLKeys.reference_key_return reference_key224 =null;



        try {
            // PLSQL_DMLParser.g:432:5: ( ( ignore_key ^| keep_key ^) nav_key | unique_key ^ ( dimension_key | single_key reference_key !) )
            int alt75=2;
            int LA75_0 = input.LA(1);

            if ( (LA75_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("keep"))||(input.LT(1).getText().equalsIgnoreCase("ignore"))))) {
                alt75=1;
            }
            else if ( (LA75_0==SQL92_RESERVED_UNIQUE) ) {
                alt75=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 75, 0, input);

                throw nvae;

            }
            switch (alt75) {
                case 1 :
                    // PLSQL_DMLParser.g:432:10: ( ignore_key ^| keep_key ^) nav_key
                    {
                    root_0 = (Object)adaptor.nil();


                    // PLSQL_DMLParser.g:432:10: ( ignore_key ^| keep_key ^)
                    int alt73=2;
                    int LA73_0 = input.LA(1);

                    if ( (LA73_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("keep"))||(input.LT(1).getText().equalsIgnoreCase("ignore"))))) {
                        int LA73_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("ignore"))) ) {
                            alt73=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("keep"))) ) {
                            alt73=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 73, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 73, 0, input);

                        throw nvae;

                    }
                    switch (alt73) {
                        case 1 :
                            // PLSQL_DMLParser.g:432:11: ignore_key ^
                            {
                            pushFollow(FOLLOW_ignore_key_in_cell_reference_options3520);
                            ignore_key218=gPLSQLParser.ignore_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(ignore_key218.getTree(), root_0);

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:432:23: keep_key ^
                            {
                            pushFollow(FOLLOW_keep_key_in_cell_reference_options3523);
                            keep_key219=gPLSQLParser.keep_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(keep_key219.getTree(), root_0);

                            }
                            break;

                    }


                    pushFollow(FOLLOW_nav_key_in_cell_reference_options3527);
                    nav_key220=gPLSQLParser.nav_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, nav_key220.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:433:10: unique_key ^ ( dimension_key | single_key reference_key !)
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_unique_key_in_cell_reference_options3538);
                    unique_key221=gPLSQLParser.unique_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(unique_key221.getTree(), root_0);

                    // PLSQL_DMLParser.g:433:22: ( dimension_key | single_key reference_key !)
                    int alt74=2;
                    int LA74_0 = input.LA(1);

                    if ( (LA74_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("single"))||(input.LT(1).getText().equalsIgnoreCase("dimension"))))) {
                        int LA74_1 = input.LA(2);

                        if ( (LA74_1==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("single"))||(input.LT(1).getText().equalsIgnoreCase("dimension"))))) {
                            int LA74_2 = input.LA(3);

                            if ( ((input.LT(1).getText().equalsIgnoreCase("dimension"))) ) {
                                alt74=1;
                            }
                            else if ( ((input.LT(1).getText().equalsIgnoreCase("single"))) ) {
                                alt74=2;
                            }
                            else {
                                if (state.backtracking>0) {state.failed=true; return retval;}
                                NoViableAltException nvae =
                                    new NoViableAltException("", 74, 2, input);

                                throw nvae;

                            }
                        }
                        else if ( (LA74_1==LEFT_PAREN||LA74_1==SQL92_RESERVED_UNIQUE) && ((input.LT(1).getText().equalsIgnoreCase("dimension")))) {
                            alt74=1;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 74, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 74, 0, input);

                        throw nvae;

                    }
                    switch (alt74) {
                        case 1 :
                            // PLSQL_DMLParser.g:433:23: dimension_key
                            {
                            pushFollow(FOLLOW_dimension_key_in_cell_reference_options3542);
                            dimension_key222=gPLSQLParser.dimension_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, dimension_key222.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:433:37: single_key reference_key !
                            {
                            pushFollow(FOLLOW_single_key_in_cell_reference_options3544);
                            single_key223=gPLSQLParser.single_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, single_key223.getTree());

                            pushFollow(FOLLOW_reference_key_in_cell_reference_options3546);
                            reference_key224=gPLSQLParser.reference_key();

                            state._fsp--;
                            if (state.failed) return retval;

                            }
                            break;

                    }


                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "cell_reference_options"


    public static class return_rows_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "return_rows_clause"
    // PLSQL_DMLParser.g:436:1: return_rows_clause : return_key ^ ( updated_key | all_key ) rows_key !;
    public final PLSQLParser_PLSQL_DMLParser.return_rows_clause_return return_rows_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.return_rows_clause_return retval = new PLSQLParser_PLSQL_DMLParser.return_rows_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.return_key_return return_key225 =null;

        PLSQLParser_PLSQLKeys.updated_key_return updated_key226 =null;

        PLSQLParser_PLSQLKeys.all_key_return all_key227 =null;

        PLSQLParser_PLSQLKeys.rows_key_return rows_key228 =null;



        try {
            // PLSQL_DMLParser.g:437:5: ( return_key ^ ( updated_key | all_key ) rows_key !)
            // PLSQL_DMLParser.g:437:10: return_key ^ ( updated_key | all_key ) rows_key !
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_return_key_in_return_rows_clause3569);
            return_key225=gPLSQLParser.return_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(return_key225.getTree(), root_0);

            // PLSQL_DMLParser.g:437:22: ( updated_key | all_key )
            int alt76=2;
            int LA76_0 = input.LA(1);

            if ( (LA76_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("updated")))) {
                alt76=1;
            }
            else if ( (LA76_0==SQL92_RESERVED_ALL) ) {
                alt76=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 76, 0, input);

                throw nvae;

            }
            switch (alt76) {
                case 1 :
                    // PLSQL_DMLParser.g:437:23: updated_key
                    {
                    pushFollow(FOLLOW_updated_key_in_return_rows_clause3573);
                    updated_key226=gPLSQLParser.updated_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, updated_key226.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:437:35: all_key
                    {
                    pushFollow(FOLLOW_all_key_in_return_rows_clause3575);
                    all_key227=gPLSQLParser.all_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, all_key227.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_rows_key_in_return_rows_clause3578);
            rows_key228=gPLSQLParser.rows_key();

            state._fsp--;
            if (state.failed) return retval;

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "return_rows_clause"


    public static class reference_model_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "reference_model"
    // PLSQL_DMLParser.g:440:1: reference_model : reference_key ^ reference_model_name on_key ! LEFT_PAREN ! subquery RIGHT_PAREN ! model_column_clauses ( cell_reference_options )* ;
    public final PLSQLParser_PLSQL_DMLParser.reference_model_return reference_model() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.reference_model_return retval = new PLSQLParser_PLSQL_DMLParser.reference_model_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN232=null;
        Token RIGHT_PAREN234=null;
        PLSQLParser_PLSQLKeys.reference_key_return reference_key229 =null;

        PLSQLParser_PLSQLCommons.reference_model_name_return reference_model_name230 =null;

        PLSQLParser_PLSQLKeys.on_key_return on_key231 =null;

        PLSQLParser_PLSQL_DMLParser.subquery_return subquery233 =null;

        PLSQLParser_PLSQL_DMLParser.model_column_clauses_return model_column_clauses235 =null;

        PLSQLParser_PLSQL_DMLParser.cell_reference_options_return cell_reference_options236 =null;


        Object LEFT_PAREN232_tree=null;
        Object RIGHT_PAREN234_tree=null;

        try {
            // PLSQL_DMLParser.g:441:5: ( reference_key ^ reference_model_name on_key ! LEFT_PAREN ! subquery RIGHT_PAREN ! model_column_clauses ( cell_reference_options )* )
            // PLSQL_DMLParser.g:441:10: reference_key ^ reference_model_name on_key ! LEFT_PAREN ! subquery RIGHT_PAREN ! model_column_clauses ( cell_reference_options )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_reference_key_in_reference_model3599);
            reference_key229=gPLSQLParser.reference_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(reference_key229.getTree(), root_0);

            pushFollow(FOLLOW_reference_model_name_in_reference_model3602);
            reference_model_name230=gPLSQLParser.reference_model_name();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, reference_model_name230.getTree());

            pushFollow(FOLLOW_on_key_in_reference_model3604);
            on_key231=gPLSQLParser.on_key();

            state._fsp--;
            if (state.failed) return retval;

            LEFT_PAREN232=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_reference_model3620); if (state.failed) return retval;

            pushFollow(FOLLOW_subquery_in_reference_model3623);
            subquery233=subquery();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, subquery233.getTree());

            RIGHT_PAREN234=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_reference_model3625); if (state.failed) return retval;

            pushFollow(FOLLOW_model_column_clauses_in_reference_model3628);
            model_column_clauses235=model_column_clauses();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, model_column_clauses235.getTree());

            // PLSQL_DMLParser.g:443:13: ( cell_reference_options )*
            loop77:
            do {
                int alt77=2;
                int LA77_0 = input.LA(1);

                if ( (LA77_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("dimension"))||(input.LT(1).getText().equalsIgnoreCase("keep"))||(input.LT(1).getText().equalsIgnoreCase("main"))||(input.LT(1).getText().equalsIgnoreCase("partition"))||(input.LT(1).getText().equalsIgnoreCase("ignore"))))) {
                    int LA77_1 = input.LA(2);

                    if ( (LA77_1==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("keep"))||(input.LT(1).getText().equalsIgnoreCase("main"))||(input.LT(1).getText().equalsIgnoreCase("ignore"))))) {
                        int LA77_4 = input.LA(3);

                        if ( (((input.LT(1).getText().equalsIgnoreCase("keep"))||(input.LT(1).getText().equalsIgnoreCase("ignore")))) ) {
                            alt77=1;
                        }


                    }


                }
                else if ( (LA77_0==SQL92_RESERVED_UNIQUE) ) {
                    alt77=1;
                }


                switch (alt77) {
            	case 1 :
            	    // PLSQL_DMLParser.g:443:13: cell_reference_options
            	    {
            	    pushFollow(FOLLOW_cell_reference_options_in_reference_model3643);
            	    cell_reference_options236=cell_reference_options();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, cell_reference_options236.getTree());

            	    }
            	    break;

            	default :
            	    break loop77;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "reference_model"


    public static class main_model_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "main_model"
    // PLSQL_DMLParser.g:446:1: main_model : ( main_key main_model_name )? model_column_clauses ( cell_reference_options )* model_rules_clause -> ^( MAIN_MODEL ( main_model_name )? model_column_clauses model_rules_clause ( cell_reference_options )* ) ;
    public final PLSQLParser_PLSQL_DMLParser.main_model_return main_model() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.main_model_return retval = new PLSQLParser_PLSQL_DMLParser.main_model_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.main_key_return main_key237 =null;

        PLSQLParser_PLSQLCommons.main_model_name_return main_model_name238 =null;

        PLSQLParser_PLSQL_DMLParser.model_column_clauses_return model_column_clauses239 =null;

        PLSQLParser_PLSQL_DMLParser.cell_reference_options_return cell_reference_options240 =null;

        PLSQLParser_PLSQL_DMLParser.model_rules_clause_return model_rules_clause241 =null;


        RewriteRuleSubtreeStream stream_main_key=new RewriteRuleSubtreeStream(adaptor,"rule main_key");
        RewriteRuleSubtreeStream stream_main_model_name=new RewriteRuleSubtreeStream(adaptor,"rule main_model_name");
        RewriteRuleSubtreeStream stream_model_column_clauses=new RewriteRuleSubtreeStream(adaptor,"rule model_column_clauses");
        RewriteRuleSubtreeStream stream_cell_reference_options=new RewriteRuleSubtreeStream(adaptor,"rule cell_reference_options");
        RewriteRuleSubtreeStream stream_model_rules_clause=new RewriteRuleSubtreeStream(adaptor,"rule model_rules_clause");
        try {
            // PLSQL_DMLParser.g:447:5: ( ( main_key main_model_name )? model_column_clauses ( cell_reference_options )* model_rules_clause -> ^( MAIN_MODEL ( main_model_name )? model_column_clauses model_rules_clause ( cell_reference_options )* ) )
            // PLSQL_DMLParser.g:447:10: ( main_key main_model_name )? model_column_clauses ( cell_reference_options )* model_rules_clause
            {
            // PLSQL_DMLParser.g:447:10: ( main_key main_model_name )?
            int alt78=2;
            int LA78_0 = input.LA(1);

            if ( (LA78_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("dimension"))||(input.LT(1).getText().equalsIgnoreCase("main"))||(input.LT(1).getText().equalsIgnoreCase("partition"))))) {
                int LA78_1 = input.LA(2);

                if ( (LA78_1==DELIMITED_ID||LA78_1==INTRODUCER||LA78_1==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("main")))) {
                    alt78=1;
                }
            }
            switch (alt78) {
                case 1 :
                    // PLSQL_DMLParser.g:447:11: main_key main_model_name
                    {
                    pushFollow(FOLLOW_main_key_in_main_model3665);
                    main_key237=gPLSQLParser.main_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_main_key.add(main_key237.getTree());

                    pushFollow(FOLLOW_main_model_name_in_main_model3667);
                    main_model_name238=gPLSQLParser.main_model_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_main_model_name.add(main_model_name238.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_model_column_clauses_in_main_model3671);
            model_column_clauses239=model_column_clauses();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_model_column_clauses.add(model_column_clauses239.getTree());

            // PLSQL_DMLParser.g:447:59: ( cell_reference_options )*
            loop79:
            do {
                int alt79=2;
                int LA79_0 = input.LA(1);

                if ( (LA79_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("rules"))||(input.LT(1).getText().equalsIgnoreCase("keep"))||(input.LT(1).getText().equalsIgnoreCase("ignore"))))) {
                    int LA79_1 = input.LA(2);

                    if ( (LA79_1==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("rules"))||(input.LT(1).getText().equalsIgnoreCase("keep"))||(input.LT(1).getText().equalsIgnoreCase("ignore"))))) {
                        int LA79_5 = input.LA(3);

                        if ( (((input.LT(1).getText().equalsIgnoreCase("keep"))||(input.LT(1).getText().equalsIgnoreCase("ignore")))) ) {
                            alt79=1;
                        }


                    }


                }
                else if ( (LA79_0==SQL92_RESERVED_UNIQUE) ) {
                    alt79=1;
                }


                switch (alt79) {
            	case 1 :
            	    // PLSQL_DMLParser.g:447:59: cell_reference_options
            	    {
            	    pushFollow(FOLLOW_cell_reference_options_in_main_model3673);
            	    cell_reference_options240=cell_reference_options();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_cell_reference_options.add(cell_reference_options240.getTree());

            	    }
            	    break;

            	default :
            	    break loop79;
                }
            } while (true);


            pushFollow(FOLLOW_model_rules_clause_in_main_model3676);
            model_rules_clause241=model_rules_clause();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_model_rules_clause.add(model_rules_clause241.getTree());

            // AST REWRITE
            // elements: cell_reference_options, model_column_clauses, model_rules_clause, main_model_name
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 448:9: -> ^( MAIN_MODEL ( main_model_name )? model_column_clauses model_rules_clause ( cell_reference_options )* )
            {
                // PLSQL_DMLParser.g:448:12: ^( MAIN_MODEL ( main_model_name )? model_column_clauses model_rules_clause ( cell_reference_options )* )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(MAIN_MODEL, "MAIN_MODEL")
                , root_1);

                // PLSQL_DMLParser.g:448:25: ( main_model_name )?
                if ( stream_main_model_name.hasNext() ) {
                    adaptor.addChild(root_1, stream_main_model_name.nextTree());

                }
                stream_main_model_name.reset();

                adaptor.addChild(root_1, stream_model_column_clauses.nextTree());

                adaptor.addChild(root_1, stream_model_rules_clause.nextTree());

                // PLSQL_DMLParser.g:448:82: ( cell_reference_options )*
                while ( stream_cell_reference_options.hasNext() ) {
                    adaptor.addChild(root_1, stream_cell_reference_options.nextTree());

                }
                stream_cell_reference_options.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "main_model"


    public static class model_column_clauses_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "model_column_clauses"
    // PLSQL_DMLParser.g:451:1: model_column_clauses : ( model_column_partition_part )? dimension_key by_key model_column_list measures_key model_column_list -> ^( MODEL_COLUMN ^( dimension_key model_column_list ) ^( measures_key model_column_list ) ( model_column_partition_part )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.model_column_clauses_return model_column_clauses() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.model_column_clauses_return retval = new PLSQLParser_PLSQL_DMLParser.model_column_clauses_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.model_column_partition_part_return model_column_partition_part242 =null;

        PLSQLParser_PLSQLKeys.dimension_key_return dimension_key243 =null;

        PLSQLParser_PLSQLKeys.by_key_return by_key244 =null;

        PLSQLParser_PLSQL_DMLParser.model_column_list_return model_column_list245 =null;

        PLSQLParser_PLSQLKeys.measures_key_return measures_key246 =null;

        PLSQLParser_PLSQL_DMLParser.model_column_list_return model_column_list247 =null;


        RewriteRuleSubtreeStream stream_model_column_list=new RewriteRuleSubtreeStream(adaptor,"rule model_column_list");
        RewriteRuleSubtreeStream stream_dimension_key=new RewriteRuleSubtreeStream(adaptor,"rule dimension_key");
        RewriteRuleSubtreeStream stream_by_key=new RewriteRuleSubtreeStream(adaptor,"rule by_key");
        RewriteRuleSubtreeStream stream_model_column_partition_part=new RewriteRuleSubtreeStream(adaptor,"rule model_column_partition_part");
        RewriteRuleSubtreeStream stream_measures_key=new RewriteRuleSubtreeStream(adaptor,"rule measures_key");
        try {
            // PLSQL_DMLParser.g:452:5: ( ( model_column_partition_part )? dimension_key by_key model_column_list measures_key model_column_list -> ^( MODEL_COLUMN ^( dimension_key model_column_list ) ^( measures_key model_column_list ) ( model_column_partition_part )? ) )
            // PLSQL_DMLParser.g:452:10: ( model_column_partition_part )? dimension_key by_key model_column_list measures_key model_column_list
            {
            // PLSQL_DMLParser.g:452:10: ( model_column_partition_part )?
            int alt80=2;
            int LA80_0 = input.LA(1);

            if ( (LA80_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("dimension"))||(input.LT(1).getText().equalsIgnoreCase("partition"))))) {
                int LA80_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("partition"))) ) {
                    alt80=1;
                }
            }
            switch (alt80) {
                case 1 :
                    // PLSQL_DMLParser.g:452:10: model_column_partition_part
                    {
                    pushFollow(FOLLOW_model_column_partition_part_in_model_column_clauses3720);
                    model_column_partition_part242=model_column_partition_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_model_column_partition_part.add(model_column_partition_part242.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_dimension_key_in_model_column_clauses3731);
            dimension_key243=gPLSQLParser.dimension_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_dimension_key.add(dimension_key243.getTree());

            pushFollow(FOLLOW_by_key_in_model_column_clauses3733);
            by_key244=gPLSQLParser.by_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_by_key.add(by_key244.getTree());

            pushFollow(FOLLOW_model_column_list_in_model_column_clauses3735);
            model_column_list245=model_column_list();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_model_column_list.add(model_column_list245.getTree());

            pushFollow(FOLLOW_measures_key_in_model_column_clauses3737);
            measures_key246=gPLSQLParser.measures_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_measures_key.add(measures_key246.getTree());

            pushFollow(FOLLOW_model_column_list_in_model_column_clauses3739);
            model_column_list247=model_column_list();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_model_column_list.add(model_column_list247.getTree());

            // AST REWRITE
            // elements: model_column_partition_part, model_column_list, measures_key, dimension_key, model_column_list
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 454:9: -> ^( MODEL_COLUMN ^( dimension_key model_column_list ) ^( measures_key model_column_list ) ( model_column_partition_part )? )
            {
                // PLSQL_DMLParser.g:454:12: ^( MODEL_COLUMN ^( dimension_key model_column_list ) ^( measures_key model_column_list ) ( model_column_partition_part )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(MODEL_COLUMN, "MODEL_COLUMN")
                , root_1);

                // PLSQL_DMLParser.g:454:27: ^( dimension_key model_column_list )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_dimension_key.nextNode(), root_2);

                adaptor.addChild(root_2, stream_model_column_list.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                // PLSQL_DMLParser.g:454:62: ^( measures_key model_column_list )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_measures_key.nextNode(), root_2);

                adaptor.addChild(root_2, stream_model_column_list.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                // PLSQL_DMLParser.g:454:96: ( model_column_partition_part )?
                if ( stream_model_column_partition_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_model_column_partition_part.nextTree());

                }
                stream_model_column_partition_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "model_column_clauses"


    public static class model_column_partition_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "model_column_partition_part"
    // PLSQL_DMLParser.g:457:1: model_column_partition_part : partition_key ^ by_key ! model_column_list ;
    public final PLSQLParser_PLSQL_DMLParser.model_column_partition_part_return model_column_partition_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.model_column_partition_part_return retval = new PLSQLParser_PLSQL_DMLParser.model_column_partition_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.partition_key_return partition_key248 =null;

        PLSQLParser_PLSQLKeys.by_key_return by_key249 =null;

        PLSQLParser_PLSQL_DMLParser.model_column_list_return model_column_list250 =null;



        try {
            // PLSQL_DMLParser.g:458:5: ( partition_key ^ by_key ! model_column_list )
            // PLSQL_DMLParser.g:458:10: partition_key ^ by_key ! model_column_list
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_partition_key_in_model_column_partition_part3788);
            partition_key248=gPLSQLParser.partition_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(partition_key248.getTree(), root_0);

            pushFollow(FOLLOW_by_key_in_model_column_partition_part3791);
            by_key249=gPLSQLParser.by_key();

            state._fsp--;
            if (state.failed) return retval;

            pushFollow(FOLLOW_model_column_list_in_model_column_partition_part3794);
            model_column_list250=model_column_list();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, model_column_list250.getTree());

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "model_column_partition_part"


    public static class model_column_list_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "model_column_list"
    // PLSQL_DMLParser.g:461:1: model_column_list : LEFT_PAREN model_column ( COMMA model_column )* RIGHT_PAREN -> ^( MODEL_COLUMNS ( model_column )+ ) ;
    public final PLSQLParser_PLSQL_DMLParser.model_column_list_return model_column_list() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.model_column_list_return retval = new PLSQLParser_PLSQL_DMLParser.model_column_list_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN251=null;
        Token COMMA253=null;
        Token RIGHT_PAREN255=null;
        PLSQLParser_PLSQL_DMLParser.model_column_return model_column252 =null;

        PLSQLParser_PLSQL_DMLParser.model_column_return model_column254 =null;


        Object LEFT_PAREN251_tree=null;
        Object COMMA253_tree=null;
        Object RIGHT_PAREN255_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_model_column=new RewriteRuleSubtreeStream(adaptor,"rule model_column");
        try {
            // PLSQL_DMLParser.g:462:5: ( LEFT_PAREN model_column ( COMMA model_column )* RIGHT_PAREN -> ^( MODEL_COLUMNS ( model_column )+ ) )
            // PLSQL_DMLParser.g:462:10: LEFT_PAREN model_column ( COMMA model_column )* RIGHT_PAREN
            {
            LEFT_PAREN251=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_model_column_list3814); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN251);


            pushFollow(FOLLOW_model_column_in_model_column_list3816);
            model_column252=model_column();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_model_column.add(model_column252.getTree());

            // PLSQL_DMLParser.g:462:34: ( COMMA model_column )*
            loop81:
            do {
                int alt81=2;
                int LA81_0 = input.LA(1);

                if ( (LA81_0==COMMA) ) {
                    alt81=1;
                }


                switch (alt81) {
            	case 1 :
            	    // PLSQL_DMLParser.g:462:35: COMMA model_column
            	    {
            	    COMMA253=(Token)match(input,COMMA,FOLLOW_COMMA_in_model_column_list3819); if (state.failed) return retval; 
            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA253);


            	    pushFollow(FOLLOW_model_column_in_model_column_list3821);
            	    model_column254=model_column();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_model_column.add(model_column254.getTree());

            	    }
            	    break;

            	default :
            	    break loop81;
                }
            } while (true);


            RIGHT_PAREN255=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_model_column_list3826); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN255);


            // AST REWRITE
            // elements: model_column
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 463:9: -> ^( MODEL_COLUMNS ( model_column )+ )
            {
                // PLSQL_DMLParser.g:463:12: ^( MODEL_COLUMNS ( model_column )+ )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(MODEL_COLUMNS, "MODEL_COLUMNS")
                , root_1);

                if ( !(stream_model_column.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_model_column.hasNext() ) {
                    adaptor.addChild(root_1, stream_model_column.nextTree());

                }
                stream_model_column.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "model_column_list"


    public static class model_column_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "model_column"
    // PLSQL_DMLParser.g:466:1: model_column : expression ( alias )? -> ^( MODEL_COLUMN ( alias )? ^( EXPR expression ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.model_column_return model_column() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.model_column_return retval = new PLSQLParser_PLSQL_DMLParser.model_column_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression256 =null;

        PLSQLParser_PLSQLCommons.alias_return alias257 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_alias=new RewriteRuleSubtreeStream(adaptor,"rule alias");
        try {
            // PLSQL_DMLParser.g:467:5: ( expression ( alias )? -> ^( MODEL_COLUMN ( alias )? ^( EXPR expression ) ) )
            // PLSQL_DMLParser.g:467:10: expression ( alias )?
            {
            pushFollow(FOLLOW_expression_in_model_column3863);
            expression256=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression256.getTree());

            // PLSQL_DMLParser.g:467:21: ( alias )?
            int alt82=2;
            int LA82_0 = input.LA(1);

            if ( (LA82_0==CHAR_STRING||LA82_0==DELIMITED_ID||LA82_0==INTRODUCER||LA82_0==REGULAR_ID||LA82_0==SQL92_RESERVED_AS) ) {
                alt82=1;
            }
            switch (alt82) {
                case 1 :
                    // PLSQL_DMLParser.g:467:21: alias
                    {
                    pushFollow(FOLLOW_alias_in_model_column3865);
                    alias257=gPLSQLParser.alias();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_alias.add(alias257.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: expression, alias
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 468:9: -> ^( MODEL_COLUMN ( alias )? ^( EXPR expression ) )
            {
                // PLSQL_DMLParser.g:468:12: ^( MODEL_COLUMN ( alias )? ^( EXPR expression ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(MODEL_COLUMN, "MODEL_COLUMN")
                , root_1);

                // PLSQL_DMLParser.g:468:27: ( alias )?
                if ( stream_alias.hasNext() ) {
                    adaptor.addChild(root_1, stream_alias.nextTree());

                }
                stream_alias.reset();

                // PLSQL_DMLParser.g:468:34: ^( EXPR expression )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_expression.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "model_column"


    public static class model_rules_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "model_rules_clause"
    // PLSQL_DMLParser.g:471:1: model_rules_clause : ( model_rules_part )? LEFT_PAREN model_rules_element ( COMMA model_rules_element )* RIGHT_PAREN -> ^( MODEL_RULES ( model_rules_element )+ ( model_rules_part )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.model_rules_clause_return model_rules_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.model_rules_clause_return retval = new PLSQLParser_PLSQL_DMLParser.model_rules_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN259=null;
        Token COMMA261=null;
        Token RIGHT_PAREN263=null;
        PLSQLParser_PLSQL_DMLParser.model_rules_part_return model_rules_part258 =null;

        PLSQLParser_PLSQL_DMLParser.model_rules_element_return model_rules_element260 =null;

        PLSQLParser_PLSQL_DMLParser.model_rules_element_return model_rules_element262 =null;


        Object LEFT_PAREN259_tree=null;
        Object COMMA261_tree=null;
        Object RIGHT_PAREN263_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_model_rules_element=new RewriteRuleSubtreeStream(adaptor,"rule model_rules_element");
        RewriteRuleSubtreeStream stream_model_rules_part=new RewriteRuleSubtreeStream(adaptor,"rule model_rules_part");
        try {
            // PLSQL_DMLParser.g:472:5: ( ( model_rules_part )? LEFT_PAREN model_rules_element ( COMMA model_rules_element )* RIGHT_PAREN -> ^( MODEL_RULES ( model_rules_element )+ ( model_rules_part )? ) )
            // PLSQL_DMLParser.g:472:10: ( model_rules_part )? LEFT_PAREN model_rules_element ( COMMA model_rules_element )* RIGHT_PAREN
            {
            // PLSQL_DMLParser.g:472:10: ( model_rules_part )?
            int alt83=2;
            int LA83_0 = input.LA(1);

            if ( (LA83_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("rules")))) {
                alt83=1;
            }
            switch (alt83) {
                case 1 :
                    // PLSQL_DMLParser.g:472:10: model_rules_part
                    {
                    pushFollow(FOLLOW_model_rules_part_in_model_rules_clause3910);
                    model_rules_part258=model_rules_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_model_rules_part.add(model_rules_part258.getTree());

                    }
                    break;

            }


            LEFT_PAREN259=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_model_rules_clause3913); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN259);


            pushFollow(FOLLOW_model_rules_element_in_model_rules_clause3915);
            model_rules_element260=model_rules_element();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_model_rules_element.add(model_rules_element260.getTree());

            // PLSQL_DMLParser.g:472:59: ( COMMA model_rules_element )*
            loop84:
            do {
                int alt84=2;
                int LA84_0 = input.LA(1);

                if ( (LA84_0==COMMA) ) {
                    alt84=1;
                }


                switch (alt84) {
            	case 1 :
            	    // PLSQL_DMLParser.g:472:60: COMMA model_rules_element
            	    {
            	    COMMA261=(Token)match(input,COMMA,FOLLOW_COMMA_in_model_rules_clause3918); if (state.failed) return retval; 
            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA261);


            	    pushFollow(FOLLOW_model_rules_element_in_model_rules_clause3920);
            	    model_rules_element262=model_rules_element();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_model_rules_element.add(model_rules_element262.getTree());

            	    }
            	    break;

            	default :
            	    break loop84;
                }
            } while (true);


            RIGHT_PAREN263=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_model_rules_clause3924); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN263);


            // AST REWRITE
            // elements: model_rules_element, model_rules_part
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 473:9: -> ^( MODEL_RULES ( model_rules_element )+ ( model_rules_part )? )
            {
                // PLSQL_DMLParser.g:473:12: ^( MODEL_RULES ( model_rules_element )+ ( model_rules_part )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(MODEL_RULES, "MODEL_RULES")
                , root_1);

                if ( !(stream_model_rules_element.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_model_rules_element.hasNext() ) {
                    adaptor.addChild(root_1, stream_model_rules_element.nextTree());

                }
                stream_model_rules_element.reset();

                // PLSQL_DMLParser.g:473:47: ( model_rules_part )?
                if ( stream_model_rules_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_model_rules_part.nextTree());

                }
                stream_model_rules_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "model_rules_clause"


    public static class model_rules_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "model_rules_part"
    // PLSQL_DMLParser.g:476:1: model_rules_part : rules_key ( update_key | upsert_key ( all_key )? )? ( ( automatic_key | sequential_key ) order_key )? ( model_iterate_clause )? -> ^( rules_key ( update_key )? ( upsert_key )? ( all_key )? ( automatic_key )? ( sequential_key )? ( model_iterate_clause )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.model_rules_part_return model_rules_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.model_rules_part_return retval = new PLSQLParser_PLSQL_DMLParser.model_rules_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.rules_key_return rules_key264 =null;

        PLSQLParser_PLSQLKeys.update_key_return update_key265 =null;

        PLSQLParser_PLSQLKeys.upsert_key_return upsert_key266 =null;

        PLSQLParser_PLSQLKeys.all_key_return all_key267 =null;

        PLSQLParser_PLSQLKeys.automatic_key_return automatic_key268 =null;

        PLSQLParser_PLSQLKeys.sequential_key_return sequential_key269 =null;

        PLSQLParser_PLSQLKeys.order_key_return order_key270 =null;

        PLSQLParser_PLSQL_DMLParser.model_iterate_clause_return model_iterate_clause271 =null;


        RewriteRuleSubtreeStream stream_all_key=new RewriteRuleSubtreeStream(adaptor,"rule all_key");
        RewriteRuleSubtreeStream stream_sequential_key=new RewriteRuleSubtreeStream(adaptor,"rule sequential_key");
        RewriteRuleSubtreeStream stream_order_key=new RewriteRuleSubtreeStream(adaptor,"rule order_key");
        RewriteRuleSubtreeStream stream_rules_key=new RewriteRuleSubtreeStream(adaptor,"rule rules_key");
        RewriteRuleSubtreeStream stream_model_iterate_clause=new RewriteRuleSubtreeStream(adaptor,"rule model_iterate_clause");
        RewriteRuleSubtreeStream stream_update_key=new RewriteRuleSubtreeStream(adaptor,"rule update_key");
        RewriteRuleSubtreeStream stream_automatic_key=new RewriteRuleSubtreeStream(adaptor,"rule automatic_key");
        RewriteRuleSubtreeStream stream_upsert_key=new RewriteRuleSubtreeStream(adaptor,"rule upsert_key");
        try {
            // PLSQL_DMLParser.g:477:5: ( rules_key ( update_key | upsert_key ( all_key )? )? ( ( automatic_key | sequential_key ) order_key )? ( model_iterate_clause )? -> ^( rules_key ( update_key )? ( upsert_key )? ( all_key )? ( automatic_key )? ( sequential_key )? ( model_iterate_clause )? ) )
            // PLSQL_DMLParser.g:477:10: rules_key ( update_key | upsert_key ( all_key )? )? ( ( automatic_key | sequential_key ) order_key )? ( model_iterate_clause )?
            {
            pushFollow(FOLLOW_rules_key_in_model_rules_part3964);
            rules_key264=gPLSQLParser.rules_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_rules_key.add(rules_key264.getTree());

            // PLSQL_DMLParser.g:477:20: ( update_key | upsert_key ( all_key )? )?
            int alt86=3;
            int LA86_0 = input.LA(1);

            if ( (LA86_0==SQL92_RESERVED_UPDATE) ) {
                alt86=1;
            }
            else if ( (LA86_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("automatic"))||(input.LT(1).getText().equalsIgnoreCase("iterate"))||(input.LT(1).getText().equalsIgnoreCase("upsert"))||(input.LT(1).getText().equalsIgnoreCase("sequential"))))) {
                int LA86_2 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("upsert"))) ) {
                    alt86=2;
                }
            }
            switch (alt86) {
                case 1 :
                    // PLSQL_DMLParser.g:477:21: update_key
                    {
                    pushFollow(FOLLOW_update_key_in_model_rules_part3967);
                    update_key265=gPLSQLParser.update_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_update_key.add(update_key265.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:477:32: upsert_key ( all_key )?
                    {
                    pushFollow(FOLLOW_upsert_key_in_model_rules_part3969);
                    upsert_key266=gPLSQLParser.upsert_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_upsert_key.add(upsert_key266.getTree());

                    // PLSQL_DMLParser.g:477:43: ( all_key )?
                    int alt85=2;
                    int LA85_0 = input.LA(1);

                    if ( (LA85_0==SQL92_RESERVED_ALL) ) {
                        alt85=1;
                    }
                    switch (alt85) {
                        case 1 :
                            // PLSQL_DMLParser.g:477:43: all_key
                            {
                            pushFollow(FOLLOW_all_key_in_model_rules_part3971);
                            all_key267=gPLSQLParser.all_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_all_key.add(all_key267.getTree());

                            }
                            break;

                    }


                    }
                    break;

            }


            // PLSQL_DMLParser.g:477:54: ( ( automatic_key | sequential_key ) order_key )?
            int alt88=2;
            int LA88_0 = input.LA(1);

            if ( (LA88_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("automatic"))||(input.LT(1).getText().equalsIgnoreCase("iterate"))||(input.LT(1).getText().equalsIgnoreCase("sequential"))))) {
                int LA88_1 = input.LA(2);

                if ( (LA88_1==SQL92_RESERVED_ORDER) && (((input.LT(1).getText().equalsIgnoreCase("automatic"))||(input.LT(1).getText().equalsIgnoreCase("sequential"))))) {
                    alt88=1;
                }
            }
            switch (alt88) {
                case 1 :
                    // PLSQL_DMLParser.g:477:55: ( automatic_key | sequential_key ) order_key
                    {
                    // PLSQL_DMLParser.g:477:55: ( automatic_key | sequential_key )
                    int alt87=2;
                    int LA87_0 = input.LA(1);

                    if ( (LA87_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("automatic"))||(input.LT(1).getText().equalsIgnoreCase("sequential"))))) {
                        int LA87_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("automatic"))) ) {
                            alt87=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("sequential"))) ) {
                            alt87=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 87, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 87, 0, input);

                        throw nvae;

                    }
                    switch (alt87) {
                        case 1 :
                            // PLSQL_DMLParser.g:477:56: automatic_key
                            {
                            pushFollow(FOLLOW_automatic_key_in_model_rules_part3978);
                            automatic_key268=gPLSQLParser.automatic_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_automatic_key.add(automatic_key268.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:477:70: sequential_key
                            {
                            pushFollow(FOLLOW_sequential_key_in_model_rules_part3980);
                            sequential_key269=gPLSQLParser.sequential_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_sequential_key.add(sequential_key269.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_order_key_in_model_rules_part3983);
                    order_key270=gPLSQLParser.order_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_order_key.add(order_key270.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:477:98: ( model_iterate_clause )?
            int alt89=2;
            int LA89_0 = input.LA(1);

            if ( (LA89_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("iterate")))) {
                alt89=1;
            }
            switch (alt89) {
                case 1 :
                    // PLSQL_DMLParser.g:477:98: model_iterate_clause
                    {
                    pushFollow(FOLLOW_model_iterate_clause_in_model_rules_part3987);
                    model_iterate_clause271=model_iterate_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_model_iterate_clause.add(model_iterate_clause271.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: sequential_key, upsert_key, update_key, all_key, automatic_key, rules_key, model_iterate_clause
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 478:9: -> ^( rules_key ( update_key )? ( upsert_key )? ( all_key )? ( automatic_key )? ( sequential_key )? ( model_iterate_clause )? )
            {
                // PLSQL_DMLParser.g:478:12: ^( rules_key ( update_key )? ( upsert_key )? ( all_key )? ( automatic_key )? ( sequential_key )? ( model_iterate_clause )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_rules_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:478:24: ( update_key )?
                if ( stream_update_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_update_key.nextTree());

                }
                stream_update_key.reset();

                // PLSQL_DMLParser.g:478:36: ( upsert_key )?
                if ( stream_upsert_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_upsert_key.nextTree());

                }
                stream_upsert_key.reset();

                // PLSQL_DMLParser.g:478:48: ( all_key )?
                if ( stream_all_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_all_key.nextTree());

                }
                stream_all_key.reset();

                // PLSQL_DMLParser.g:478:57: ( automatic_key )?
                if ( stream_automatic_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_automatic_key.nextTree());

                }
                stream_automatic_key.reset();

                // PLSQL_DMLParser.g:478:72: ( sequential_key )?
                if ( stream_sequential_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_sequential_key.nextTree());

                }
                stream_sequential_key.reset();

                // PLSQL_DMLParser.g:478:88: ( model_iterate_clause )?
                if ( stream_model_iterate_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_model_iterate_clause.nextTree());

                }
                stream_model_iterate_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "model_rules_part"


    public static class model_rules_element_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "model_rules_element"
    // PLSQL_DMLParser.g:481:1: model_rules_element : ( update_key | upsert_key ( ( all_key )=> all_key )? )? cell_assignment ( order_by_clause )? EQUALS_OP expression -> ^( MODEL_RULE ^( ASSIGN[$EQUALS_OP] cell_assignment ^( EXPR expression ) ) ( update_key )? ( upsert_key )? ( all_key )? ( order_by_clause )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.model_rules_element_return model_rules_element() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.model_rules_element_return retval = new PLSQLParser_PLSQL_DMLParser.model_rules_element_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token EQUALS_OP277=null;
        PLSQLParser_PLSQLKeys.update_key_return update_key272 =null;

        PLSQLParser_PLSQLKeys.upsert_key_return upsert_key273 =null;

        PLSQLParser_PLSQLKeys.all_key_return all_key274 =null;

        PLSQLParser_PLSQL_DMLParser.cell_assignment_return cell_assignment275 =null;

        PLSQLParser_PLSQL_DMLParser.order_by_clause_return order_by_clause276 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression278 =null;


        Object EQUALS_OP277_tree=null;
        RewriteRuleTokenStream stream_EQUALS_OP=new RewriteRuleTokenStream(adaptor,"token EQUALS_OP");
        RewriteRuleSubtreeStream stream_all_key=new RewriteRuleSubtreeStream(adaptor,"rule all_key");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_order_by_clause=new RewriteRuleSubtreeStream(adaptor,"rule order_by_clause");
        RewriteRuleSubtreeStream stream_update_key=new RewriteRuleSubtreeStream(adaptor,"rule update_key");
        RewriteRuleSubtreeStream stream_cell_assignment=new RewriteRuleSubtreeStream(adaptor,"rule cell_assignment");
        RewriteRuleSubtreeStream stream_upsert_key=new RewriteRuleSubtreeStream(adaptor,"rule upsert_key");
        try {
            // PLSQL_DMLParser.g:482:5: ( ( update_key | upsert_key ( ( all_key )=> all_key )? )? cell_assignment ( order_by_clause )? EQUALS_OP expression -> ^( MODEL_RULE ^( ASSIGN[$EQUALS_OP] cell_assignment ^( EXPR expression ) ) ( update_key )? ( upsert_key )? ( all_key )? ( order_by_clause )? ) )
            // PLSQL_DMLParser.g:482:10: ( update_key | upsert_key ( ( all_key )=> all_key )? )? cell_assignment ( order_by_clause )? EQUALS_OP expression
            {
            // PLSQL_DMLParser.g:482:10: ( update_key | upsert_key ( ( all_key )=> all_key )? )?
            int alt91=3;
            int LA91_0 = input.LA(1);

            if ( (LA91_0==SQL92_RESERVED_UPDATE) ) {
                alt91=1;
            }
            else if ( (LA91_0==REGULAR_ID) ) {
                int LA91_2 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("upsert"))) ) {
                    alt91=2;
                }
            }
            switch (alt91) {
                case 1 :
                    // PLSQL_DMLParser.g:482:11: update_key
                    {
                    pushFollow(FOLLOW_update_key_in_model_rules_element4041);
                    update_key272=gPLSQLParser.update_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_update_key.add(update_key272.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:482:22: upsert_key ( ( all_key )=> all_key )?
                    {
                    pushFollow(FOLLOW_upsert_key_in_model_rules_element4043);
                    upsert_key273=gPLSQLParser.upsert_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_upsert_key.add(upsert_key273.getTree());

                    // PLSQL_DMLParser.g:482:33: ( ( all_key )=> all_key )?
                    int alt90=2;
                    int LA90_0 = input.LA(1);

                    if ( (LA90_0==SQL92_RESERVED_ALL) ) {
                        int LA90_1 = input.LA(2);

                        if ( (synpred12_PLSQL_DMLParser()) ) {
                            alt90=1;
                        }
                    }
                    switch (alt90) {
                        case 1 :
                            // PLSQL_DMLParser.g:482:34: ( all_key )=> all_key
                            {
                            pushFollow(FOLLOW_all_key_in_model_rules_element4051);
                            all_key274=gPLSQLParser.all_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_all_key.add(all_key274.getTree());

                            }
                            break;

                    }


                    }
                    break;

            }


            pushFollow(FOLLOW_cell_assignment_in_model_rules_element4065);
            cell_assignment275=cell_assignment();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_cell_assignment.add(cell_assignment275.getTree());

            // PLSQL_DMLParser.g:484:17: ( order_by_clause )?
            int alt92=2;
            int LA92_0 = input.LA(1);

            if ( (LA92_0==SQL92_RESERVED_ORDER) ) {
                alt92=1;
            }
            switch (alt92) {
                case 1 :
                    // PLSQL_DMLParser.g:484:17: order_by_clause
                    {
                    pushFollow(FOLLOW_order_by_clause_in_model_rules_element4083);
                    order_by_clause276=order_by_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_order_by_clause.add(order_by_clause276.getTree());

                    }
                    break;

            }


            EQUALS_OP277=(Token)match(input,EQUALS_OP,FOLLOW_EQUALS_OP_in_model_rules_element4098); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_EQUALS_OP.add(EQUALS_OP277);


            pushFollow(FOLLOW_expression_in_model_rules_element4100);
            expression278=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression278.getTree());

            // AST REWRITE
            // elements: order_by_clause, upsert_key, cell_assignment, update_key, expression, all_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 486:9: -> ^( MODEL_RULE ^( ASSIGN[$EQUALS_OP] cell_assignment ^( EXPR expression ) ) ( update_key )? ( upsert_key )? ( all_key )? ( order_by_clause )? )
            {
                // PLSQL_DMLParser.g:486:12: ^( MODEL_RULE ^( ASSIGN[$EQUALS_OP] cell_assignment ^( EXPR expression ) ) ( update_key )? ( upsert_key )? ( all_key )? ( order_by_clause )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(MODEL_RULE, "MODEL_RULE")
                , root_1);

                // PLSQL_DMLParser.g:486:25: ^( ASSIGN[$EQUALS_OP] cell_assignment ^( EXPR expression ) )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(ASSIGN, EQUALS_OP277)
                , root_2);

                adaptor.addChild(root_2, stream_cell_assignment.nextTree());

                // PLSQL_DMLParser.g:486:62: ^( EXPR expression )
                {
                Object root_3 = (Object)adaptor.nil();
                root_3 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_3);

                adaptor.addChild(root_3, stream_expression.nextTree());

                adaptor.addChild(root_2, root_3);
                }

                adaptor.addChild(root_1, root_2);
                }

                // PLSQL_DMLParser.g:486:82: ( update_key )?
                if ( stream_update_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_update_key.nextTree());

                }
                stream_update_key.reset();

                // PLSQL_DMLParser.g:486:94: ( upsert_key )?
                if ( stream_upsert_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_upsert_key.nextTree());

                }
                stream_upsert_key.reset();

                // PLSQL_DMLParser.g:486:106: ( all_key )?
                if ( stream_all_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_all_key.nextTree());

                }
                stream_all_key.reset();

                // PLSQL_DMLParser.g:486:115: ( order_by_clause )?
                if ( stream_order_by_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_order_by_clause.nextTree());

                }
                stream_order_by_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "model_rules_element"


    public static class cell_assignment_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "cell_assignment"
    // PLSQL_DMLParser.g:489:1: cell_assignment : model_expression ;
    public final PLSQLParser_PLSQL_DMLParser.cell_assignment_return cell_assignment() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.cell_assignment_return retval = new PLSQLParser_PLSQL_DMLParser.cell_assignment_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.model_expression_return model_expression279 =null;



        try {
            // PLSQL_DMLParser.g:490:5: ( model_expression )
            // PLSQL_DMLParser.g:490:10: model_expression
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_model_expression_in_cell_assignment4159);
            model_expression279=model_expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, model_expression279.getTree());

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "cell_assignment"


    public static class model_iterate_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "model_iterate_clause"
    // PLSQL_DMLParser.g:493:1: model_iterate_clause : iterate_key LEFT_PAREN expression RIGHT_PAREN ( until_part )? -> ^( iterate_key ^( EXPR expression ) ( until_part )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.model_iterate_clause_return model_iterate_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.model_iterate_clause_return retval = new PLSQLParser_PLSQL_DMLParser.model_iterate_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN281=null;
        Token RIGHT_PAREN283=null;
        PLSQLParser_PLSQLKeys.iterate_key_return iterate_key280 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression282 =null;

        PLSQLParser_PLSQL_DMLParser.until_part_return until_part284 =null;


        Object LEFT_PAREN281_tree=null;
        Object RIGHT_PAREN283_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleSubtreeStream stream_iterate_key=new RewriteRuleSubtreeStream(adaptor,"rule iterate_key");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_until_part=new RewriteRuleSubtreeStream(adaptor,"rule until_part");
        try {
            // PLSQL_DMLParser.g:494:5: ( iterate_key LEFT_PAREN expression RIGHT_PAREN ( until_part )? -> ^( iterate_key ^( EXPR expression ) ( until_part )? ) )
            // PLSQL_DMLParser.g:494:10: iterate_key LEFT_PAREN expression RIGHT_PAREN ( until_part )?
            {
            pushFollow(FOLLOW_iterate_key_in_model_iterate_clause4179);
            iterate_key280=gPLSQLParser.iterate_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_iterate_key.add(iterate_key280.getTree());

            LEFT_PAREN281=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_model_iterate_clause4181); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN281);


            pushFollow(FOLLOW_expression_in_model_iterate_clause4183);
            expression282=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression282.getTree());

            RIGHT_PAREN283=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_model_iterate_clause4185); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN283);


            // PLSQL_DMLParser.g:494:56: ( until_part )?
            int alt93=2;
            int LA93_0 = input.LA(1);

            if ( (LA93_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("until")))) {
                alt93=1;
            }
            switch (alt93) {
                case 1 :
                    // PLSQL_DMLParser.g:494:56: until_part
                    {
                    pushFollow(FOLLOW_until_part_in_model_iterate_clause4187);
                    until_part284=until_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_until_part.add(until_part284.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: expression, until_part, iterate_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 495:9: -> ^( iterate_key ^( EXPR expression ) ( until_part )? )
            {
                // PLSQL_DMLParser.g:495:11: ^( iterate_key ^( EXPR expression ) ( until_part )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_iterate_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:495:25: ^( EXPR expression )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_expression.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                // PLSQL_DMLParser.g:495:44: ( until_part )?
                if ( stream_until_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_until_part.nextTree());

                }
                stream_until_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "model_iterate_clause"


    public static class until_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "until_part"
    // PLSQL_DMLParser.g:498:1: until_part : until_key LEFT_PAREN condition RIGHT_PAREN -> ^( until_key ^( LOGIC_EXPR condition ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.until_part_return until_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.until_part_return retval = new PLSQLParser_PLSQL_DMLParser.until_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN286=null;
        Token RIGHT_PAREN288=null;
        PLSQLParser_PLSQLKeys.until_key_return until_key285 =null;

        PLSQLParser_PLSQL_DMLParser.condition_return condition287 =null;


        Object LEFT_PAREN286_tree=null;
        Object RIGHT_PAREN288_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleSubtreeStream stream_until_key=new RewriteRuleSubtreeStream(adaptor,"rule until_key");
        RewriteRuleSubtreeStream stream_condition=new RewriteRuleSubtreeStream(adaptor,"rule condition");
        try {
            // PLSQL_DMLParser.g:499:5: ( until_key LEFT_PAREN condition RIGHT_PAREN -> ^( until_key ^( LOGIC_EXPR condition ) ) )
            // PLSQL_DMLParser.g:499:10: until_key LEFT_PAREN condition RIGHT_PAREN
            {
            pushFollow(FOLLOW_until_key_in_until_part4230);
            until_key285=gPLSQLParser.until_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_until_key.add(until_key285.getTree());

            LEFT_PAREN286=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_until_part4232); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN286);


            pushFollow(FOLLOW_condition_in_until_part4234);
            condition287=condition();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_condition.add(condition287.getTree());

            RIGHT_PAREN288=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_until_part4236); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN288);


            // AST REWRITE
            // elements: until_key, condition
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 500:9: -> ^( until_key ^( LOGIC_EXPR condition ) )
            {
                // PLSQL_DMLParser.g:500:12: ^( until_key ^( LOGIC_EXPR condition ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_until_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:500:24: ^( LOGIC_EXPR condition )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(LOGIC_EXPR, "LOGIC_EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_condition.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "until_part"


    public static class order_by_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "order_by_clause"
    // PLSQL_DMLParser.g:503:1: order_by_clause : order_key ( siblings_key )? by_key order_by_elements ( COMMA order_by_elements )* -> ^( order_key ( siblings_key )? ^( ORDER_BY_ELEMENTS ( order_by_elements )+ ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.order_by_clause_return order_by_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.order_by_clause_return retval = new PLSQLParser_PLSQL_DMLParser.order_by_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COMMA293=null;
        PLSQLParser_PLSQLKeys.order_key_return order_key289 =null;

        PLSQLParser_PLSQLKeys.siblings_key_return siblings_key290 =null;

        PLSQLParser_PLSQLKeys.by_key_return by_key291 =null;

        PLSQLParser_PLSQL_DMLParser.order_by_elements_return order_by_elements292 =null;

        PLSQLParser_PLSQL_DMLParser.order_by_elements_return order_by_elements294 =null;


        Object COMMA293_tree=null;
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_order_key=new RewriteRuleSubtreeStream(adaptor,"rule order_key");
        RewriteRuleSubtreeStream stream_by_key=new RewriteRuleSubtreeStream(adaptor,"rule by_key");
        RewriteRuleSubtreeStream stream_siblings_key=new RewriteRuleSubtreeStream(adaptor,"rule siblings_key");
        RewriteRuleSubtreeStream stream_order_by_elements=new RewriteRuleSubtreeStream(adaptor,"rule order_by_elements");
        try {
            // PLSQL_DMLParser.g:504:5: ( order_key ( siblings_key )? by_key order_by_elements ( COMMA order_by_elements )* -> ^( order_key ( siblings_key )? ^( ORDER_BY_ELEMENTS ( order_by_elements )+ ) ) )
            // PLSQL_DMLParser.g:504:10: order_key ( siblings_key )? by_key order_by_elements ( COMMA order_by_elements )*
            {
            pushFollow(FOLLOW_order_key_in_order_by_clause4276);
            order_key289=gPLSQLParser.order_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_order_key.add(order_key289.getTree());

            // PLSQL_DMLParser.g:504:20: ( siblings_key )?
            int alt94=2;
            int LA94_0 = input.LA(1);

            if ( (LA94_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("siblings")))) {
                alt94=1;
            }
            switch (alt94) {
                case 1 :
                    // PLSQL_DMLParser.g:504:20: siblings_key
                    {
                    pushFollow(FOLLOW_siblings_key_in_order_by_clause4278);
                    siblings_key290=gPLSQLParser.siblings_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_siblings_key.add(siblings_key290.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_by_key_in_order_by_clause4281);
            by_key291=gPLSQLParser.by_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_by_key.add(by_key291.getTree());

            pushFollow(FOLLOW_order_by_elements_in_order_by_clause4283);
            order_by_elements292=order_by_elements();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_order_by_elements.add(order_by_elements292.getTree());

            // PLSQL_DMLParser.g:504:59: ( COMMA order_by_elements )*
            loop95:
            do {
                int alt95=2;
                int LA95_0 = input.LA(1);

                if ( (LA95_0==COMMA) ) {
                    alt95=1;
                }


                switch (alt95) {
            	case 1 :
            	    // PLSQL_DMLParser.g:504:60: COMMA order_by_elements
            	    {
            	    COMMA293=(Token)match(input,COMMA,FOLLOW_COMMA_in_order_by_clause4286); if (state.failed) return retval; 
            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA293);


            	    pushFollow(FOLLOW_order_by_elements_in_order_by_clause4288);
            	    order_by_elements294=order_by_elements();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_order_by_elements.add(order_by_elements294.getTree());

            	    }
            	    break;

            	default :
            	    break loop95;
                }
            } while (true);


            // AST REWRITE
            // elements: order_by_elements, siblings_key, order_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 505:9: -> ^( order_key ( siblings_key )? ^( ORDER_BY_ELEMENTS ( order_by_elements )+ ) )
            {
                // PLSQL_DMLParser.g:505:12: ^( order_key ( siblings_key )? ^( ORDER_BY_ELEMENTS ( order_by_elements )+ ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_order_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:505:24: ( siblings_key )?
                if ( stream_siblings_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_siblings_key.nextTree());

                }
                stream_siblings_key.reset();

                // PLSQL_DMLParser.g:505:38: ^( ORDER_BY_ELEMENTS ( order_by_elements )+ )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(ORDER_BY_ELEMENTS, "ORDER_BY_ELEMENTS")
                , root_2);

                if ( !(stream_order_by_elements.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_order_by_elements.hasNext() ) {
                    adaptor.addChild(root_2, stream_order_by_elements.nextTree());

                }
                stream_order_by_elements.reset();

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "order_by_clause"


    public static class order_by_elements_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "order_by_elements"
    // PLSQL_DMLParser.g:508:1: order_by_elements : expression ( asc_key | desc_key )? ( nulls_key ( first_key | last_key ) )? -> ^( ORDER_BY_ELEMENT ^( EXPR expression ) ( asc_key )? ( desc_key )? ( nulls_key )? ( first_key )? ( last_key )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.order_by_elements_return order_by_elements() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.order_by_elements_return retval = new PLSQLParser_PLSQL_DMLParser.order_by_elements_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression295 =null;

        PLSQLParser_PLSQLKeys.asc_key_return asc_key296 =null;

        PLSQLParser_PLSQLKeys.desc_key_return desc_key297 =null;

        PLSQLParser_PLSQLKeys.nulls_key_return nulls_key298 =null;

        PLSQLParser_PLSQLKeys.first_key_return first_key299 =null;

        PLSQLParser_PLSQLKeys.last_key_return last_key300 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_desc_key=new RewriteRuleSubtreeStream(adaptor,"rule desc_key");
        RewriteRuleSubtreeStream stream_nulls_key=new RewriteRuleSubtreeStream(adaptor,"rule nulls_key");
        RewriteRuleSubtreeStream stream_last_key=new RewriteRuleSubtreeStream(adaptor,"rule last_key");
        RewriteRuleSubtreeStream stream_asc_key=new RewriteRuleSubtreeStream(adaptor,"rule asc_key");
        RewriteRuleSubtreeStream stream_first_key=new RewriteRuleSubtreeStream(adaptor,"rule first_key");
        try {
            // PLSQL_DMLParser.g:509:5: ( expression ( asc_key | desc_key )? ( nulls_key ( first_key | last_key ) )? -> ^( ORDER_BY_ELEMENT ^( EXPR expression ) ( asc_key )? ( desc_key )? ( nulls_key )? ( first_key )? ( last_key )? ) )
            // PLSQL_DMLParser.g:509:10: expression ( asc_key | desc_key )? ( nulls_key ( first_key | last_key ) )?
            {
            pushFollow(FOLLOW_expression_in_order_by_elements4334);
            expression295=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression295.getTree());

            // PLSQL_DMLParser.g:509:21: ( asc_key | desc_key )?
            int alt96=3;
            int LA96_0 = input.LA(1);

            if ( (LA96_0==SQL92_RESERVED_ASC) ) {
                alt96=1;
            }
            else if ( (LA96_0==SQL92_RESERVED_DESC) ) {
                alt96=2;
            }
            switch (alt96) {
                case 1 :
                    // PLSQL_DMLParser.g:509:22: asc_key
                    {
                    pushFollow(FOLLOW_asc_key_in_order_by_elements4337);
                    asc_key296=gPLSQLParser.asc_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_asc_key.add(asc_key296.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:509:30: desc_key
                    {
                    pushFollow(FOLLOW_desc_key_in_order_by_elements4339);
                    desc_key297=gPLSQLParser.desc_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_desc_key.add(desc_key297.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:509:41: ( nulls_key ( first_key | last_key ) )?
            int alt98=2;
            int LA98_0 = input.LA(1);

            if ( (LA98_0==REGULAR_ID) ) {
                int LA98_1 = input.LA(2);

                if ( (LA98_1==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("log"))||(input.LT(1).getText().equalsIgnoreCase("nulls"))||(input.LT(1).getText().equalsIgnoreCase("rows"))||(input.LT(1).getText().equalsIgnoreCase("range"))))) {
                    int LA98_3 = input.LA(3);

                    if ( ((input.LT(1).getText().equalsIgnoreCase("nulls"))) ) {
                        alt98=1;
                    }
                }
            }
            switch (alt98) {
                case 1 :
                    // PLSQL_DMLParser.g:509:42: nulls_key ( first_key | last_key )
                    {
                    pushFollow(FOLLOW_nulls_key_in_order_by_elements4344);
                    nulls_key298=gPLSQLParser.nulls_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_nulls_key.add(nulls_key298.getTree());

                    // PLSQL_DMLParser.g:509:52: ( first_key | last_key )
                    int alt97=2;
                    int LA97_0 = input.LA(1);

                    if ( (LA97_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("first"))||(input.LT(1).getText().equalsIgnoreCase("last"))))) {
                        int LA97_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("first"))) ) {
                            alt97=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("last"))) ) {
                            alt97=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 97, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 97, 0, input);

                        throw nvae;

                    }
                    switch (alt97) {
                        case 1 :
                            // PLSQL_DMLParser.g:509:53: first_key
                            {
                            pushFollow(FOLLOW_first_key_in_order_by_elements4347);
                            first_key299=gPLSQLParser.first_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_first_key.add(first_key299.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:509:63: last_key
                            {
                            pushFollow(FOLLOW_last_key_in_order_by_elements4349);
                            last_key300=gPLSQLParser.last_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_last_key.add(last_key300.getTree());

                            }
                            break;

                    }


                    }
                    break;

            }


            // AST REWRITE
            // elements: nulls_key, desc_key, asc_key, first_key, expression, last_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 510:9: -> ^( ORDER_BY_ELEMENT ^( EXPR expression ) ( asc_key )? ( desc_key )? ( nulls_key )? ( first_key )? ( last_key )? )
            {
                // PLSQL_DMLParser.g:510:12: ^( ORDER_BY_ELEMENT ^( EXPR expression ) ( asc_key )? ( desc_key )? ( nulls_key )? ( first_key )? ( last_key )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(ORDER_BY_ELEMENT, "ORDER_BY_ELEMENT")
                , root_1);

                // PLSQL_DMLParser.g:510:31: ^( EXPR expression )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_expression.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                // PLSQL_DMLParser.g:510:50: ( asc_key )?
                if ( stream_asc_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_asc_key.nextTree());

                }
                stream_asc_key.reset();

                // PLSQL_DMLParser.g:510:59: ( desc_key )?
                if ( stream_desc_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_desc_key.nextTree());

                }
                stream_desc_key.reset();

                // PLSQL_DMLParser.g:510:69: ( nulls_key )?
                if ( stream_nulls_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_nulls_key.nextTree());

                }
                stream_nulls_key.reset();

                // PLSQL_DMLParser.g:510:80: ( first_key )?
                if ( stream_first_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_first_key.nextTree());

                }
                stream_first_key.reset();

                // PLSQL_DMLParser.g:510:91: ( last_key )?
                if ( stream_last_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_last_key.nextTree());

                }
                stream_last_key.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "order_by_elements"


    public static class for_update_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "for_update_clause"
    // PLSQL_DMLParser.g:513:1: for_update_clause : for_key update_key ( for_update_of_part )? ( for_update_options )? -> ^( for_key ( for_update_of_part )? ( for_update_options )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.for_update_clause_return for_update_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.for_update_clause_return retval = new PLSQLParser_PLSQL_DMLParser.for_update_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.for_key_return for_key301 =null;

        PLSQLParser_PLSQLKeys.update_key_return update_key302 =null;

        PLSQLParser_PLSQL_DMLParser.for_update_of_part_return for_update_of_part303 =null;

        PLSQLParser_PLSQL_DMLParser.for_update_options_return for_update_options304 =null;


        RewriteRuleSubtreeStream stream_for_update_of_part=new RewriteRuleSubtreeStream(adaptor,"rule for_update_of_part");
        RewriteRuleSubtreeStream stream_for_update_options=new RewriteRuleSubtreeStream(adaptor,"rule for_update_options");
        RewriteRuleSubtreeStream stream_update_key=new RewriteRuleSubtreeStream(adaptor,"rule update_key");
        RewriteRuleSubtreeStream stream_for_key=new RewriteRuleSubtreeStream(adaptor,"rule for_key");
        try {
            // PLSQL_DMLParser.g:514:5: ( for_key update_key ( for_update_of_part )? ( for_update_options )? -> ^( for_key ( for_update_of_part )? ( for_update_options )? ) )
            // PLSQL_DMLParser.g:514:10: for_key update_key ( for_update_of_part )? ( for_update_options )?
            {
            pushFollow(FOLLOW_for_key_in_for_update_clause4407);
            for_key301=gPLSQLParser.for_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_for_key.add(for_key301.getTree());

            pushFollow(FOLLOW_update_key_in_for_update_clause4409);
            update_key302=gPLSQLParser.update_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_update_key.add(update_key302.getTree());

            // PLSQL_DMLParser.g:514:29: ( for_update_of_part )?
            int alt99=2;
            int LA99_0 = input.LA(1);

            if ( (LA99_0==SQL92_RESERVED_OF) ) {
                alt99=1;
            }
            switch (alt99) {
                case 1 :
                    // PLSQL_DMLParser.g:514:29: for_update_of_part
                    {
                    pushFollow(FOLLOW_for_update_of_part_in_for_update_clause4411);
                    for_update_of_part303=for_update_of_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_for_update_of_part.add(for_update_of_part303.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:514:49: ( for_update_options )?
            int alt100=2;
            int LA100_0 = input.LA(1);

            if ( (LA100_0==REGULAR_ID) ) {
                int LA100_1 = input.LA(2);

                if ( (((input.LT(1).getText().equalsIgnoreCase("skip"))||(input.LT(1).getText().equalsIgnoreCase("wait")))) ) {
                    alt100=1;
                }
            }
            else if ( (LA100_0==PLSQL_RESERVED_NOWAIT) ) {
                alt100=1;
            }
            switch (alt100) {
                case 1 :
                    // PLSQL_DMLParser.g:514:49: for_update_options
                    {
                    pushFollow(FOLLOW_for_update_options_in_for_update_clause4414);
                    for_update_options304=for_update_options();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_for_update_options.add(for_update_options304.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: for_key, for_update_of_part, for_update_options
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 515:9: -> ^( for_key ( for_update_of_part )? ( for_update_options )? )
            {
                // PLSQL_DMLParser.g:515:12: ^( for_key ( for_update_of_part )? ( for_update_options )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_for_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:515:22: ( for_update_of_part )?
                if ( stream_for_update_of_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_for_update_of_part.nextTree());

                }
                stream_for_update_of_part.reset();

                // PLSQL_DMLParser.g:515:42: ( for_update_options )?
                if ( stream_for_update_options.hasNext() ) {
                    adaptor.addChild(root_1, stream_for_update_options.nextTree());

                }
                stream_for_update_options.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "for_update_clause"


    public static class for_update_of_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "for_update_of_part"
    // PLSQL_DMLParser.g:518:1: for_update_of_part : of_key ^ column_name ( COMMA ! column_name )* ;
    public final PLSQLParser_PLSQL_DMLParser.for_update_of_part_return for_update_of_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.for_update_of_part_return retval = new PLSQLParser_PLSQL_DMLParser.for_update_of_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COMMA307=null;
        PLSQLParser_PLSQLKeys.of_key_return of_key305 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name306 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name308 =null;


        Object COMMA307_tree=null;

        try {
            // PLSQL_DMLParser.g:519:5: ( of_key ^ column_name ( COMMA ! column_name )* )
            // PLSQL_DMLParser.g:519:10: of_key ^ column_name ( COMMA ! column_name )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_of_key_in_for_update_of_part4455);
            of_key305=gPLSQLParser.of_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(of_key305.getTree(), root_0);

            pushFollow(FOLLOW_column_name_in_for_update_of_part4458);
            column_name306=gPLSQLParser.column_name();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, column_name306.getTree());

            // PLSQL_DMLParser.g:519:30: ( COMMA ! column_name )*
            loop101:
            do {
                int alt101=2;
                int LA101_0 = input.LA(1);

                if ( (LA101_0==COMMA) ) {
                    alt101=1;
                }


                switch (alt101) {
            	case 1 :
            	    // PLSQL_DMLParser.g:519:31: COMMA ! column_name
            	    {
            	    COMMA307=(Token)match(input,COMMA,FOLLOW_COMMA_in_for_update_of_part4461); if (state.failed) return retval;

            	    pushFollow(FOLLOW_column_name_in_for_update_of_part4464);
            	    column_name308=gPLSQLParser.column_name();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, column_name308.getTree());

            	    }
            	    break;

            	default :
            	    break loop101;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "for_update_of_part"


    public static class for_update_options_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "for_update_options"
    // PLSQL_DMLParser.g:522:1: for_update_options : ( skip_key locked_key !| nowait_key | wait_key expression -> ^( wait_key ^( EXPR expression ) ) );
    public final PLSQLParser_PLSQL_DMLParser.for_update_options_return for_update_options() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.for_update_options_return retval = new PLSQLParser_PLSQL_DMLParser.for_update_options_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.skip_key_return skip_key309 =null;

        PLSQLParser_PLSQLKeys.locked_key_return locked_key310 =null;

        PLSQLParser_PLSQLKeys.nowait_key_return nowait_key311 =null;

        PLSQLParser_PLSQLKeys.wait_key_return wait_key312 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression313 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_wait_key=new RewriteRuleSubtreeStream(adaptor,"rule wait_key");
        try {
            // PLSQL_DMLParser.g:523:5: ( skip_key locked_key !| nowait_key | wait_key expression -> ^( wait_key ^( EXPR expression ) ) )
            int alt102=3;
            int LA102_0 = input.LA(1);

            if ( (LA102_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("skip"))||(input.LT(1).getText().equalsIgnoreCase("wait"))))) {
                int LA102_1 = input.LA(2);

                if ( (LA102_1==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("skip"))||(input.LT(1).getText().equalsIgnoreCase("wait"))))) {
                    int LA102_3 = input.LA(3);

                    if ( ((input.LT(1).getText().equalsIgnoreCase("skip"))) ) {
                        alt102=1;
                    }
                    else if ( ((input.LT(1).getText().equalsIgnoreCase("wait"))) ) {
                        alt102=3;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 102, 3, input);

                        throw nvae;

                    }
                }
                else if ( (LA102_1==APPROXIMATE_NUM_LIT||(LA102_1 >= CHAR_STRING && LA102_1 <= COLON)||LA102_1==DELIMITED_ID||LA102_1==EXACT_NUM_LIT||LA102_1==INTRODUCER||LA102_1==LEFT_PAREN||LA102_1==MINUS_SIGN||LA102_1==PLUS_SIGN||LA102_1==SQL92_RESERVED_ALL||LA102_1==SQL92_RESERVED_ANY||LA102_1==SQL92_RESERVED_CASE||LA102_1==SQL92_RESERVED_DEFAULT||LA102_1==SQL92_RESERVED_DISTINCT||(LA102_1 >= SQL92_RESERVED_EXISTS && LA102_1 <= SQL92_RESERVED_FALSE)||(LA102_1 >= SQL92_RESERVED_NOT && LA102_1 <= SQL92_RESERVED_NULL)||LA102_1==SQL92_RESERVED_PRIOR||LA102_1==SQL92_RESERVED_TRUE||LA102_1==UNSIGNED_INTEGER) && ((input.LT(1).getText().equalsIgnoreCase("wait")))) {
                    alt102=3;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 102, 1, input);

                    throw nvae;

                }
            }
            else if ( (LA102_0==PLSQL_RESERVED_NOWAIT) ) {
                alt102=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 102, 0, input);

                throw nvae;

            }
            switch (alt102) {
                case 1 :
                    // PLSQL_DMLParser.g:523:10: skip_key locked_key !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_skip_key_in_for_update_options4486);
                    skip_key309=gPLSQLParser.skip_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, skip_key309.getTree());

                    pushFollow(FOLLOW_locked_key_in_for_update_options4488);
                    locked_key310=gPLSQLParser.locked_key();

                    state._fsp--;
                    if (state.failed) return retval;

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:524:10: nowait_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_nowait_key_in_for_update_options4500);
                    nowait_key311=gPLSQLParser.nowait_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, nowait_key311.getTree());

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:525:10: wait_key expression
                    {
                    pushFollow(FOLLOW_wait_key_in_for_update_options4511);
                    wait_key312=gPLSQLParser.wait_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_wait_key.add(wait_key312.getTree());

                    pushFollow(FOLLOW_expression_in_for_update_options4513);
                    expression313=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(expression313.getTree());

                    // AST REWRITE
                    // elements: wait_key, expression
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 525:30: -> ^( wait_key ^( EXPR expression ) )
                    {
                        // PLSQL_DMLParser.g:525:33: ^( wait_key ^( EXPR expression ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(stream_wait_key.nextNode(), root_1);

                        // PLSQL_DMLParser.g:525:44: ^( EXPR expression )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(EXPR, "EXPR")
                        , root_2);

                        adaptor.addChild(root_2, stream_expression.nextTree());

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "for_update_options"


    public static class update_statement_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "update_statement"
    // PLSQL_DMLParser.g:530:1: update_statement : update_key ^ general_table_ref update_set_clause ( where_clause )? ( static_returning_clause )? ( error_logging_clause )? ;
    public final PLSQLParser_PLSQL_DMLParser.update_statement_return update_statement() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.update_statement_return retval = new PLSQLParser_PLSQL_DMLParser.update_statement_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.update_key_return update_key314 =null;

        PLSQLParser_PLSQL_DMLParser.general_table_ref_return general_table_ref315 =null;

        PLSQLParser_PLSQL_DMLParser.update_set_clause_return update_set_clause316 =null;

        PLSQLParser_PLSQLCommons.where_clause_return where_clause317 =null;

        PLSQLParser_PLSQL_DMLParser.static_returning_clause_return static_returning_clause318 =null;

        PLSQLParser_PLSQL_DMLParser.error_logging_clause_return error_logging_clause319 =null;



        try {
            // PLSQL_DMLParser.g:531:5: ( update_key ^ general_table_ref update_set_clause ( where_clause )? ( static_returning_clause )? ( error_logging_clause )? )
            // PLSQL_DMLParser.g:531:10: update_key ^ general_table_ref update_set_clause ( where_clause )? ( static_returning_clause )? ( error_logging_clause )?
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_update_key_in_update_statement4547);
            update_key314=gPLSQLParser.update_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(update_key314.getTree(), root_0);

            pushFollow(FOLLOW_general_table_ref_in_update_statement4550);
            general_table_ref315=general_table_ref();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, general_table_ref315.getTree());

            pushFollow(FOLLOW_update_set_clause_in_update_statement4560);
            update_set_clause316=update_set_clause();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, update_set_clause316.getTree());

            // PLSQL_DMLParser.g:533:9: ( where_clause )?
            int alt103=2;
            int LA103_0 = input.LA(1);

            if ( (LA103_0==SQL92_RESERVED_WHERE) ) {
                alt103=1;
            }
            switch (alt103) {
                case 1 :
                    // PLSQL_DMLParser.g:533:9: where_clause
                    {
                    pushFollow(FOLLOW_where_clause_in_update_statement4570);
                    where_clause317=gPLSQLParser.where_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, where_clause317.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:533:23: ( static_returning_clause )?
            int alt104=2;
            int LA104_0 = input.LA(1);

            if ( (LA104_0==REGULAR_ID) ) {
                int LA104_1 = input.LA(2);

                if ( (((input.LT(1).getText().equalsIgnoreCase("returning"))||(input.LT(1).getText().equalsIgnoreCase("return")))) ) {
                    alt104=1;
                }
            }
            switch (alt104) {
                case 1 :
                    // PLSQL_DMLParser.g:533:23: static_returning_clause
                    {
                    pushFollow(FOLLOW_static_returning_clause_in_update_statement4573);
                    static_returning_clause318=static_returning_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, static_returning_clause318.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:533:48: ( error_logging_clause )?
            int alt105=2;
            int LA105_0 = input.LA(1);

            if ( (LA105_0==REGULAR_ID) ) {
                int LA105_1 = input.LA(2);

                if ( (LA105_1==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("log")))) {
                    alt105=1;
                }
            }
            switch (alt105) {
                case 1 :
                    // PLSQL_DMLParser.g:533:48: error_logging_clause
                    {
                    pushFollow(FOLLOW_error_logging_clause_in_update_statement4576);
                    error_logging_clause319=error_logging_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, error_logging_clause319.getTree());

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "update_statement"


    public static class update_set_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "update_set_clause"
    // PLSQL_DMLParser.g:537:1: update_set_clause : set_key ( column_based_update_set_clause ( COMMA column_based_update_set_clause )* | value_key LEFT_PAREN id RIGHT_PAREN EQUALS_OP expression ) -> {mode == 1}? ^( set_key ( column_based_update_set_clause )+ ) -> ^( set_key ^( value_key id ^( EXPR expression ) ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.update_set_clause_return update_set_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.update_set_clause_return retval = new PLSQLParser_PLSQL_DMLParser.update_set_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COMMA322=null;
        Token LEFT_PAREN325=null;
        Token RIGHT_PAREN327=null;
        Token EQUALS_OP328=null;
        PLSQLParser_PLSQLKeys.set_key_return set_key320 =null;

        PLSQLParser_PLSQL_DMLParser.column_based_update_set_clause_return column_based_update_set_clause321 =null;

        PLSQLParser_PLSQL_DMLParser.column_based_update_set_clause_return column_based_update_set_clause323 =null;

        PLSQLParser_PLSQLKeys.value_key_return value_key324 =null;

        PLSQLParser_PLSQLCommons.id_return id326 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression329 =null;


        Object COMMA322_tree=null;
        Object LEFT_PAREN325_tree=null;
        Object RIGHT_PAREN327_tree=null;
        Object EQUALS_OP328_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleTokenStream stream_EQUALS_OP=new RewriteRuleTokenStream(adaptor,"token EQUALS_OP");
        RewriteRuleSubtreeStream stream_id=new RewriteRuleSubtreeStream(adaptor,"rule id");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_value_key=new RewriteRuleSubtreeStream(adaptor,"rule value_key");
        RewriteRuleSubtreeStream stream_column_based_update_set_clause=new RewriteRuleSubtreeStream(adaptor,"rule column_based_update_set_clause");
        RewriteRuleSubtreeStream stream_set_key=new RewriteRuleSubtreeStream(adaptor,"rule set_key");
            int mode = 0;    
        try {
            // PLSQL_DMLParser.g:539:5: ( set_key ( column_based_update_set_clause ( COMMA column_based_update_set_clause )* | value_key LEFT_PAREN id RIGHT_PAREN EQUALS_OP expression ) -> {mode == 1}? ^( set_key ( column_based_update_set_clause )+ ) -> ^( set_key ^( value_key id ^( EXPR expression ) ) ) )
            // PLSQL_DMLParser.g:539:10: set_key ( column_based_update_set_clause ( COMMA column_based_update_set_clause )* | value_key LEFT_PAREN id RIGHT_PAREN EQUALS_OP expression )
            {
            pushFollow(FOLLOW_set_key_in_update_set_clause4606);
            set_key320=gPLSQLParser.set_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_set_key.add(set_key320.getTree());

            // PLSQL_DMLParser.g:540:5: ( column_based_update_set_clause ( COMMA column_based_update_set_clause )* | value_key LEFT_PAREN id RIGHT_PAREN EQUALS_OP expression )
            int alt107=2;
            int LA107_0 = input.LA(1);

            if ( (LA107_0==DELIMITED_ID||LA107_0==INTRODUCER||LA107_0==LEFT_PAREN) ) {
                alt107=1;
            }
            else if ( (LA107_0==REGULAR_ID) ) {
                int LA107_2 = input.LA(2);

                if ( (LA107_2==EQUALS_OP||LA107_2==PERIOD) ) {
                    alt107=1;
                }
                else if ( (LA107_2==LEFT_PAREN) ) {
                    alt107=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 107, 2, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 107, 0, input);

                throw nvae;

            }
            switch (alt107) {
                case 1 :
                    // PLSQL_DMLParser.g:540:10: column_based_update_set_clause ( COMMA column_based_update_set_clause )*
                    {
                    pushFollow(FOLLOW_column_based_update_set_clause_in_update_set_clause4617);
                    column_based_update_set_clause321=column_based_update_set_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_column_based_update_set_clause.add(column_based_update_set_clause321.getTree());

                    // PLSQL_DMLParser.g:540:41: ( COMMA column_based_update_set_clause )*
                    loop106:
                    do {
                        int alt106=2;
                        int LA106_0 = input.LA(1);

                        if ( (LA106_0==COMMA) ) {
                            alt106=1;
                        }


                        switch (alt106) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:540:42: COMMA column_based_update_set_clause
                    	    {
                    	    COMMA322=(Token)match(input,COMMA,FOLLOW_COMMA_in_update_set_clause4620); if (state.failed) return retval; 
                    	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA322);


                    	    pushFollow(FOLLOW_column_based_update_set_clause_in_update_set_clause4622);
                    	    column_based_update_set_clause323=column_based_update_set_clause();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_column_based_update_set_clause.add(column_based_update_set_clause323.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop106;
                        }
                    } while (true);


                    if ( state.backtracking==0 ) {mode = 1;}

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:541:10: value_key LEFT_PAREN id RIGHT_PAREN EQUALS_OP expression
                    {
                    pushFollow(FOLLOW_value_key_in_update_set_clause4637);
                    value_key324=gPLSQLParser.value_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_value_key.add(value_key324.getTree());

                    LEFT_PAREN325=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_update_set_clause4639); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN325);


                    pushFollow(FOLLOW_id_in_update_set_clause4641);
                    id326=gPLSQLParser.id();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_id.add(id326.getTree());

                    RIGHT_PAREN327=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_update_set_clause4643); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN327);


                    EQUALS_OP328=(Token)match(input,EQUALS_OP,FOLLOW_EQUALS_OP_in_update_set_clause4645); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_EQUALS_OP.add(EQUALS_OP328);


                    pushFollow(FOLLOW_expression_in_update_set_clause4647);
                    expression329=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(expression329.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: value_key, set_key, id, set_key, expression, column_based_update_set_clause
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 543:9: -> {mode == 1}? ^( set_key ( column_based_update_set_clause )+ )
            if (mode == 1) {
                // PLSQL_DMLParser.g:543:24: ^( set_key ( column_based_update_set_clause )+ )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_set_key.nextNode(), root_1);

                if ( !(stream_column_based_update_set_clause.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_column_based_update_set_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_column_based_update_set_clause.nextTree());

                }
                stream_column_based_update_set_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }

            else // 544:9: -> ^( set_key ^( value_key id ^( EXPR expression ) ) )
            {
                // PLSQL_DMLParser.g:544:12: ^( set_key ^( value_key id ^( EXPR expression ) ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_set_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:544:22: ^( value_key id ^( EXPR expression ) )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_value_key.nextNode(), root_2);

                adaptor.addChild(root_2, stream_id.nextTree());

                // PLSQL_DMLParser.g:544:37: ^( EXPR expression )
                {
                Object root_3 = (Object)adaptor.nil();
                root_3 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_3);

                adaptor.addChild(root_3, stream_expression.nextTree());

                adaptor.addChild(root_2, root_3);
                }

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "update_set_clause"


    public static class column_based_update_set_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "column_based_update_set_clause"
    // PLSQL_DMLParser.g:547:1: column_based_update_set_clause : ( column_name EQUALS_OP expression -> ^( ASSIGN[$EQUALS_OP] column_name ^( EXPR expression ) ) | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN EQUALS_OP subquery -> ^( ASSIGN[$EQUALS_OP] ( column_name )+ subquery ) );
    public final PLSQLParser_PLSQL_DMLParser.column_based_update_set_clause_return column_based_update_set_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.column_based_update_set_clause_return retval = new PLSQLParser_PLSQL_DMLParser.column_based_update_set_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token EQUALS_OP331=null;
        Token LEFT_PAREN333=null;
        Token COMMA335=null;
        Token RIGHT_PAREN337=null;
        Token EQUALS_OP338=null;
        PLSQLParser_PLSQLCommons.column_name_return column_name330 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression332 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name334 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name336 =null;

        PLSQLParser_PLSQL_DMLParser.subquery_return subquery339 =null;


        Object EQUALS_OP331_tree=null;
        Object LEFT_PAREN333_tree=null;
        Object COMMA335_tree=null;
        Object RIGHT_PAREN337_tree=null;
        Object EQUALS_OP338_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleTokenStream stream_EQUALS_OP=new RewriteRuleTokenStream(adaptor,"token EQUALS_OP");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_column_name=new RewriteRuleSubtreeStream(adaptor,"rule column_name");
        RewriteRuleSubtreeStream stream_subquery=new RewriteRuleSubtreeStream(adaptor,"rule subquery");
        try {
            // PLSQL_DMLParser.g:548:5: ( column_name EQUALS_OP expression -> ^( ASSIGN[$EQUALS_OP] column_name ^( EXPR expression ) ) | LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN EQUALS_OP subquery -> ^( ASSIGN[$EQUALS_OP] ( column_name )+ subquery ) )
            int alt109=2;
            int LA109_0 = input.LA(1);

            if ( (LA109_0==DELIMITED_ID||LA109_0==INTRODUCER||LA109_0==REGULAR_ID) ) {
                alt109=1;
            }
            else if ( (LA109_0==LEFT_PAREN) ) {
                alt109=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 109, 0, input);

                throw nvae;

            }
            switch (alt109) {
                case 1 :
                    // PLSQL_DMLParser.g:548:10: column_name EQUALS_OP expression
                    {
                    pushFollow(FOLLOW_column_name_in_column_based_update_set_clause4717);
                    column_name330=gPLSQLParser.column_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_column_name.add(column_name330.getTree());

                    EQUALS_OP331=(Token)match(input,EQUALS_OP,FOLLOW_EQUALS_OP_in_column_based_update_set_clause4719); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_EQUALS_OP.add(EQUALS_OP331);


                    pushFollow(FOLLOW_expression_in_column_based_update_set_clause4721);
                    expression332=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(expression332.getTree());

                    // AST REWRITE
                    // elements: expression, column_name
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 548:43: -> ^( ASSIGN[$EQUALS_OP] column_name ^( EXPR expression ) )
                    {
                        // PLSQL_DMLParser.g:548:46: ^( ASSIGN[$EQUALS_OP] column_name ^( EXPR expression ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(ASSIGN, EQUALS_OP331)
                        , root_1);

                        adaptor.addChild(root_1, stream_column_name.nextTree());

                        // PLSQL_DMLParser.g:548:79: ^( EXPR expression )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(EXPR, "EXPR")
                        , root_2);

                        adaptor.addChild(root_2, stream_expression.nextTree());

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:549:10: LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN EQUALS_OP subquery
                    {
                    LEFT_PAREN333=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_column_based_update_set_clause4747); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN333);


                    pushFollow(FOLLOW_column_name_in_column_based_update_set_clause4749);
                    column_name334=gPLSQLParser.column_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_column_name.add(column_name334.getTree());

                    // PLSQL_DMLParser.g:549:33: ( COMMA column_name )*
                    loop108:
                    do {
                        int alt108=2;
                        int LA108_0 = input.LA(1);

                        if ( (LA108_0==COMMA) ) {
                            alt108=1;
                        }


                        switch (alt108) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:549:34: COMMA column_name
                    	    {
                    	    COMMA335=(Token)match(input,COMMA,FOLLOW_COMMA_in_column_based_update_set_clause4752); if (state.failed) return retval; 
                    	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA335);


                    	    pushFollow(FOLLOW_column_name_in_column_based_update_set_clause4754);
                    	    column_name336=gPLSQLParser.column_name();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_column_name.add(column_name336.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop108;
                        }
                    } while (true);


                    RIGHT_PAREN337=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_column_based_update_set_clause4758); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN337);


                    EQUALS_OP338=(Token)match(input,EQUALS_OP,FOLLOW_EQUALS_OP_in_column_based_update_set_clause4760); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_EQUALS_OP.add(EQUALS_OP338);


                    pushFollow(FOLLOW_subquery_in_column_based_update_set_clause4762);
                    subquery339=subquery();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_subquery.add(subquery339.getTree());

                    // AST REWRITE
                    // elements: subquery, column_name
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 549:85: -> ^( ASSIGN[$EQUALS_OP] ( column_name )+ subquery )
                    {
                        // PLSQL_DMLParser.g:549:88: ^( ASSIGN[$EQUALS_OP] ( column_name )+ subquery )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(ASSIGN, EQUALS_OP338)
                        , root_1);

                        if ( !(stream_column_name.hasNext()) ) {
                            throw new RewriteEarlyExitException();
                        }
                        while ( stream_column_name.hasNext() ) {
                            adaptor.addChild(root_1, stream_column_name.nextTree());

                        }
                        stream_column_name.reset();

                        adaptor.addChild(root_1, stream_subquery.nextTree());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "column_based_update_set_clause"


    public static class delete_statement_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "delete_statement"
    // PLSQL_DMLParser.g:554:1: delete_statement : delete_key ^ ( from_key !)? general_table_ref ( where_clause )? ( static_returning_clause )? ( error_logging_clause )? ;
    public final PLSQLParser_PLSQL_DMLParser.delete_statement_return delete_statement() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.delete_statement_return retval = new PLSQLParser_PLSQL_DMLParser.delete_statement_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.delete_key_return delete_key340 =null;

        PLSQLParser_PLSQLKeys.from_key_return from_key341 =null;

        PLSQLParser_PLSQL_DMLParser.general_table_ref_return general_table_ref342 =null;

        PLSQLParser_PLSQLCommons.where_clause_return where_clause343 =null;

        PLSQLParser_PLSQL_DMLParser.static_returning_clause_return static_returning_clause344 =null;

        PLSQLParser_PLSQL_DMLParser.error_logging_clause_return error_logging_clause345 =null;



        try {
            // PLSQL_DMLParser.g:555:5: ( delete_key ^ ( from_key !)? general_table_ref ( where_clause )? ( static_returning_clause )? ( error_logging_clause )? )
            // PLSQL_DMLParser.g:555:10: delete_key ^ ( from_key !)? general_table_ref ( where_clause )? ( static_returning_clause )? ( error_logging_clause )?
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_delete_key_in_delete_statement4796);
            delete_key340=gPLSQLParser.delete_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(delete_key340.getTree(), root_0);

            // PLSQL_DMLParser.g:555:30: ( from_key !)?
            int alt110=2;
            int LA110_0 = input.LA(1);

            if ( (LA110_0==SQL92_RESERVED_FROM) ) {
                alt110=1;
            }
            switch (alt110) {
                case 1 :
                    // PLSQL_DMLParser.g:555:30: from_key !
                    {
                    pushFollow(FOLLOW_from_key_in_delete_statement4799);
                    from_key341=gPLSQLParser.from_key();

                    state._fsp--;
                    if (state.failed) return retval;

                    }
                    break;

            }


            pushFollow(FOLLOW_general_table_ref_in_delete_statement4811);
            general_table_ref342=general_table_ref();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, general_table_ref342.getTree());

            // PLSQL_DMLParser.g:557:9: ( where_clause )?
            int alt111=2;
            int LA111_0 = input.LA(1);

            if ( (LA111_0==SQL92_RESERVED_WHERE) ) {
                alt111=1;
            }
            switch (alt111) {
                case 1 :
                    // PLSQL_DMLParser.g:557:9: where_clause
                    {
                    pushFollow(FOLLOW_where_clause_in_delete_statement4821);
                    where_clause343=gPLSQLParser.where_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, where_clause343.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:557:23: ( static_returning_clause )?
            int alt112=2;
            int LA112_0 = input.LA(1);

            if ( (LA112_0==REGULAR_ID) ) {
                int LA112_1 = input.LA(2);

                if ( (((input.LT(1).getText().equalsIgnoreCase("returning"))||(input.LT(1).getText().equalsIgnoreCase("return")))) ) {
                    alt112=1;
                }
            }
            switch (alt112) {
                case 1 :
                    // PLSQL_DMLParser.g:557:23: static_returning_clause
                    {
                    pushFollow(FOLLOW_static_returning_clause_in_delete_statement4824);
                    static_returning_clause344=static_returning_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, static_returning_clause344.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:557:48: ( error_logging_clause )?
            int alt113=2;
            int LA113_0 = input.LA(1);

            if ( (LA113_0==REGULAR_ID) ) {
                int LA113_1 = input.LA(2);

                if ( (LA113_1==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("log")))) {
                    alt113=1;
                }
            }
            switch (alt113) {
                case 1 :
                    // PLSQL_DMLParser.g:557:48: error_logging_clause
                    {
                    pushFollow(FOLLOW_error_logging_clause_in_delete_statement4827);
                    error_logging_clause345=error_logging_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, error_logging_clause345.getTree());

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "delete_statement"


    public static class insert_statement_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "insert_statement"
    // PLSQL_DMLParser.g:560:1: insert_statement : insert_key ^ ( single_table_insert | multi_table_insert ) ;
    public final PLSQLParser_PLSQL_DMLParser.insert_statement_return insert_statement() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.insert_statement_return retval = new PLSQLParser_PLSQL_DMLParser.insert_statement_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.insert_key_return insert_key346 =null;

        PLSQLParser_PLSQL_DMLParser.single_table_insert_return single_table_insert347 =null;

        PLSQLParser_PLSQL_DMLParser.multi_table_insert_return multi_table_insert348 =null;



        try {
            // PLSQL_DMLParser.g:561:5: ( insert_key ^ ( single_table_insert | multi_table_insert ) )
            // PLSQL_DMLParser.g:561:10: insert_key ^ ( single_table_insert | multi_table_insert )
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_insert_key_in_insert_statement4848);
            insert_key346=gPLSQLParser.insert_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(insert_key346.getTree(), root_0);

            // PLSQL_DMLParser.g:562:5: ( single_table_insert | multi_table_insert )
            int alt114=2;
            int LA114_0 = input.LA(1);

            if ( (LA114_0==SQL92_RESERVED_INTO) ) {
                alt114=1;
            }
            else if ( (LA114_0==SQL92_RESERVED_ALL) ) {
                alt114=2;
            }
            else if ( (LA114_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("first")))) {
                alt114=2;
            }
            else if ( (LA114_0==SQL92_RESERVED_WHEN) ) {
                alt114=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 114, 0, input);

                throw nvae;

            }
            switch (alt114) {
                case 1 :
                    // PLSQL_DMLParser.g:562:10: single_table_insert
                    {
                    pushFollow(FOLLOW_single_table_insert_in_insert_statement4860);
                    single_table_insert347=single_table_insert();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, single_table_insert347.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:563:10: multi_table_insert
                    {
                    pushFollow(FOLLOW_multi_table_insert_in_insert_statement4871);
                    multi_table_insert348=multi_table_insert();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, multi_table_insert348.getTree());

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "insert_statement"


    public static class single_table_insert_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "single_table_insert"
    // PLSQL_DMLParser.g:569:1: single_table_insert : insert_into_clause ( values_clause ( static_returning_clause )? | select_statement ) ( error_logging_clause )? -> ^( SINGLE_TABLE_MODE insert_into_clause ( values_clause )? ( static_returning_clause )? ( select_statement )? ( error_logging_clause )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.single_table_insert_return single_table_insert() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.single_table_insert_return retval = new PLSQLParser_PLSQL_DMLParser.single_table_insert_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.insert_into_clause_return insert_into_clause349 =null;

        PLSQLParser_PLSQL_DMLParser.values_clause_return values_clause350 =null;

        PLSQLParser_PLSQL_DMLParser.static_returning_clause_return static_returning_clause351 =null;

        PLSQLParser_PLSQL_DMLParser.select_statement_return select_statement352 =null;

        PLSQLParser_PLSQL_DMLParser.error_logging_clause_return error_logging_clause353 =null;


        RewriteRuleSubtreeStream stream_static_returning_clause=new RewriteRuleSubtreeStream(adaptor,"rule static_returning_clause");
        RewriteRuleSubtreeStream stream_values_clause=new RewriteRuleSubtreeStream(adaptor,"rule values_clause");
        RewriteRuleSubtreeStream stream_insert_into_clause=new RewriteRuleSubtreeStream(adaptor,"rule insert_into_clause");
        RewriteRuleSubtreeStream stream_error_logging_clause=new RewriteRuleSubtreeStream(adaptor,"rule error_logging_clause");
        RewriteRuleSubtreeStream stream_select_statement=new RewriteRuleSubtreeStream(adaptor,"rule select_statement");
        try {
            // PLSQL_DMLParser.g:570:5: ( insert_into_clause ( values_clause ( static_returning_clause )? | select_statement ) ( error_logging_clause )? -> ^( SINGLE_TABLE_MODE insert_into_clause ( values_clause )? ( static_returning_clause )? ( select_statement )? ( error_logging_clause )? ) )
            // PLSQL_DMLParser.g:570:10: insert_into_clause ( values_clause ( static_returning_clause )? | select_statement ) ( error_logging_clause )?
            {
            pushFollow(FOLLOW_insert_into_clause_in_single_table_insert4899);
            insert_into_clause349=insert_into_clause();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_insert_into_clause.add(insert_into_clause349.getTree());

            // PLSQL_DMLParser.g:571:5: ( values_clause ( static_returning_clause )? | select_statement )
            int alt116=2;
            int LA116_0 = input.LA(1);

            if ( (LA116_0==SQL92_RESERVED_VALUES) ) {
                alt116=1;
            }
            else if ( (LA116_0==LEFT_PAREN||LA116_0==SQL92_RESERVED_SELECT||LA116_0==SQL92_RESERVED_WITH) ) {
                alt116=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 116, 0, input);

                throw nvae;

            }
            switch (alt116) {
                case 1 :
                    // PLSQL_DMLParser.g:571:10: values_clause ( static_returning_clause )?
                    {
                    pushFollow(FOLLOW_values_clause_in_single_table_insert4910);
                    values_clause350=values_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_values_clause.add(values_clause350.getTree());

                    // PLSQL_DMLParser.g:571:24: ( static_returning_clause )?
                    int alt115=2;
                    int LA115_0 = input.LA(1);

                    if ( (LA115_0==REGULAR_ID) ) {
                        int LA115_1 = input.LA(2);

                        if ( (((input.LT(1).getText().equalsIgnoreCase("returning"))||(input.LT(1).getText().equalsIgnoreCase("return")))) ) {
                            alt115=1;
                        }
                    }
                    switch (alt115) {
                        case 1 :
                            // PLSQL_DMLParser.g:571:24: static_returning_clause
                            {
                            pushFollow(FOLLOW_static_returning_clause_in_single_table_insert4912);
                            static_returning_clause351=static_returning_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_static_returning_clause.add(static_returning_clause351.getTree());

                            }
                            break;

                    }


                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:572:10: select_statement
                    {
                    pushFollow(FOLLOW_select_statement_in_single_table_insert4924);
                    select_statement352=select_statement();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_select_statement.add(select_statement352.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:574:9: ( error_logging_clause )?
            int alt117=2;
            int LA117_0 = input.LA(1);

            if ( (LA117_0==REGULAR_ID) ) {
                int LA117_1 = input.LA(2);

                if ( (LA117_1==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("log")))) {
                    alt117=1;
                }
            }
            switch (alt117) {
                case 1 :
                    // PLSQL_DMLParser.g:574:9: error_logging_clause
                    {
                    pushFollow(FOLLOW_error_logging_clause_in_single_table_insert4940);
                    error_logging_clause353=error_logging_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_error_logging_clause.add(error_logging_clause353.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: error_logging_clause, insert_into_clause, select_statement, values_clause, static_returning_clause
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 575:9: -> ^( SINGLE_TABLE_MODE insert_into_clause ( values_clause )? ( static_returning_clause )? ( select_statement )? ( error_logging_clause )? )
            {
                // PLSQL_DMLParser.g:575:12: ^( SINGLE_TABLE_MODE insert_into_clause ( values_clause )? ( static_returning_clause )? ( select_statement )? ( error_logging_clause )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(SINGLE_TABLE_MODE, "SINGLE_TABLE_MODE")
                , root_1);

                adaptor.addChild(root_1, stream_insert_into_clause.nextTree());

                // PLSQL_DMLParser.g:575:51: ( values_clause )?
                if ( stream_values_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_values_clause.nextTree());

                }
                stream_values_clause.reset();

                // PLSQL_DMLParser.g:575:66: ( static_returning_clause )?
                if ( stream_static_returning_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_static_returning_clause.nextTree());

                }
                stream_static_returning_clause.reset();

                // PLSQL_DMLParser.g:575:91: ( select_statement )?
                if ( stream_select_statement.hasNext() ) {
                    adaptor.addChild(root_1, stream_select_statement.nextTree());

                }
                stream_select_statement.reset();

                // PLSQL_DMLParser.g:575:109: ( error_logging_clause )?
                if ( stream_error_logging_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_error_logging_clause.nextTree());

                }
                stream_error_logging_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "single_table_insert"


    public static class multi_table_insert_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "multi_table_insert"
    // PLSQL_DMLParser.g:578:1: multi_table_insert : ( all_key ( multi_table_element )+ | conditional_insert_clause ) select_statement -> ^( MULTI_TABLE_MODE select_statement ( multi_table_element )* ( conditional_insert_clause )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.multi_table_insert_return multi_table_insert() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.multi_table_insert_return retval = new PLSQLParser_PLSQL_DMLParser.multi_table_insert_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.all_key_return all_key354 =null;

        PLSQLParser_PLSQL_DMLParser.multi_table_element_return multi_table_element355 =null;

        PLSQLParser_PLSQL_DMLParser.conditional_insert_clause_return conditional_insert_clause356 =null;

        PLSQLParser_PLSQL_DMLParser.select_statement_return select_statement357 =null;


        RewriteRuleSubtreeStream stream_all_key=new RewriteRuleSubtreeStream(adaptor,"rule all_key");
        RewriteRuleSubtreeStream stream_multi_table_element=new RewriteRuleSubtreeStream(adaptor,"rule multi_table_element");
        RewriteRuleSubtreeStream stream_conditional_insert_clause=new RewriteRuleSubtreeStream(adaptor,"rule conditional_insert_clause");
        RewriteRuleSubtreeStream stream_select_statement=new RewriteRuleSubtreeStream(adaptor,"rule select_statement");
        try {
            // PLSQL_DMLParser.g:579:5: ( ( all_key ( multi_table_element )+ | conditional_insert_clause ) select_statement -> ^( MULTI_TABLE_MODE select_statement ( multi_table_element )* ( conditional_insert_clause )? ) )
            // PLSQL_DMLParser.g:580:5: ( all_key ( multi_table_element )+ | conditional_insert_clause ) select_statement
            {
            // PLSQL_DMLParser.g:580:5: ( all_key ( multi_table_element )+ | conditional_insert_clause )
            int alt119=2;
            int LA119_0 = input.LA(1);

            if ( (LA119_0==SQL92_RESERVED_ALL) ) {
                int LA119_1 = input.LA(2);

                if ( (LA119_1==SQL92_RESERVED_INTO) ) {
                    alt119=1;
                }
                else if ( (LA119_1==SQL92_RESERVED_WHEN) ) {
                    alt119=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 119, 1, input);

                    throw nvae;

                }
            }
            else if ( (LA119_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("first")))) {
                alt119=2;
            }
            else if ( (LA119_0==SQL92_RESERVED_WHEN) ) {
                alt119=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 119, 0, input);

                throw nvae;

            }
            switch (alt119) {
                case 1 :
                    // PLSQL_DMLParser.g:580:10: all_key ( multi_table_element )+
                    {
                    pushFollow(FOLLOW_all_key_in_multi_table_insert4999);
                    all_key354=gPLSQLParser.all_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_all_key.add(all_key354.getTree());

                    // PLSQL_DMLParser.g:580:18: ( multi_table_element )+
                    int cnt118=0;
                    loop118:
                    do {
                        int alt118=2;
                        int LA118_0 = input.LA(1);

                        if ( (LA118_0==SQL92_RESERVED_INTO) ) {
                            alt118=1;
                        }


                        switch (alt118) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:580:18: multi_table_element
                    	    {
                    	    pushFollow(FOLLOW_multi_table_element_in_multi_table_insert5001);
                    	    multi_table_element355=multi_table_element();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_multi_table_element.add(multi_table_element355.getTree());

                    	    }
                    	    break;

                    	default :
                    	    if ( cnt118 >= 1 ) break loop118;
                    	    if (state.backtracking>0) {state.failed=true; return retval;}
                                EarlyExitException eee =
                                    new EarlyExitException(118, input);
                                throw eee;
                        }
                        cnt118++;
                    } while (true);


                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:581:10: conditional_insert_clause
                    {
                    pushFollow(FOLLOW_conditional_insert_clause_in_multi_table_insert5013);
                    conditional_insert_clause356=conditional_insert_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_conditional_insert_clause.add(conditional_insert_clause356.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_select_statement_in_multi_table_insert5029);
            select_statement357=select_statement();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_select_statement.add(select_statement357.getTree());

            // AST REWRITE
            // elements: select_statement, conditional_insert_clause, multi_table_element
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 584:9: -> ^( MULTI_TABLE_MODE select_statement ( multi_table_element )* ( conditional_insert_clause )? )
            {
                // PLSQL_DMLParser.g:584:12: ^( MULTI_TABLE_MODE select_statement ( multi_table_element )* ( conditional_insert_clause )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(MULTI_TABLE_MODE, "MULTI_TABLE_MODE")
                , root_1);

                adaptor.addChild(root_1, stream_select_statement.nextTree());

                // PLSQL_DMLParser.g:584:48: ( multi_table_element )*
                while ( stream_multi_table_element.hasNext() ) {
                    adaptor.addChild(root_1, stream_multi_table_element.nextTree());

                }
                stream_multi_table_element.reset();

                // PLSQL_DMLParser.g:584:69: ( conditional_insert_clause )?
                if ( stream_conditional_insert_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_conditional_insert_clause.nextTree());

                }
                stream_conditional_insert_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "multi_table_insert"


    public static class multi_table_element_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "multi_table_element"
    // PLSQL_DMLParser.g:587:1: multi_table_element : insert_into_clause ( values_clause )? ( error_logging_clause )? -> ^( TABLE_ELEMENT insert_into_clause ( values_clause )? ( error_logging_clause )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.multi_table_element_return multi_table_element() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.multi_table_element_return retval = new PLSQLParser_PLSQL_DMLParser.multi_table_element_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.insert_into_clause_return insert_into_clause358 =null;

        PLSQLParser_PLSQL_DMLParser.values_clause_return values_clause359 =null;

        PLSQLParser_PLSQL_DMLParser.error_logging_clause_return error_logging_clause360 =null;


        RewriteRuleSubtreeStream stream_values_clause=new RewriteRuleSubtreeStream(adaptor,"rule values_clause");
        RewriteRuleSubtreeStream stream_insert_into_clause=new RewriteRuleSubtreeStream(adaptor,"rule insert_into_clause");
        RewriteRuleSubtreeStream stream_error_logging_clause=new RewriteRuleSubtreeStream(adaptor,"rule error_logging_clause");
        try {
            // PLSQL_DMLParser.g:588:5: ( insert_into_clause ( values_clause )? ( error_logging_clause )? -> ^( TABLE_ELEMENT insert_into_clause ( values_clause )? ( error_logging_clause )? ) )
            // PLSQL_DMLParser.g:588:10: insert_into_clause ( values_clause )? ( error_logging_clause )?
            {
            pushFollow(FOLLOW_insert_into_clause_in_multi_table_element5071);
            insert_into_clause358=insert_into_clause();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_insert_into_clause.add(insert_into_clause358.getTree());

            // PLSQL_DMLParser.g:588:29: ( values_clause )?
            int alt120=2;
            int LA120_0 = input.LA(1);

            if ( (LA120_0==SQL92_RESERVED_VALUES) ) {
                alt120=1;
            }
            switch (alt120) {
                case 1 :
                    // PLSQL_DMLParser.g:588:29: values_clause
                    {
                    pushFollow(FOLLOW_values_clause_in_multi_table_element5073);
                    values_clause359=values_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_values_clause.add(values_clause359.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:588:44: ( error_logging_clause )?
            int alt121=2;
            int LA121_0 = input.LA(1);

            if ( (LA121_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("log")))) {
                alt121=1;
            }
            switch (alt121) {
                case 1 :
                    // PLSQL_DMLParser.g:588:44: error_logging_clause
                    {
                    pushFollow(FOLLOW_error_logging_clause_in_multi_table_element5076);
                    error_logging_clause360=error_logging_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_error_logging_clause.add(error_logging_clause360.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: error_logging_clause, values_clause, insert_into_clause
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 589:9: -> ^( TABLE_ELEMENT insert_into_clause ( values_clause )? ( error_logging_clause )? )
            {
                // PLSQL_DMLParser.g:589:12: ^( TABLE_ELEMENT insert_into_clause ( values_clause )? ( error_logging_clause )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(TABLE_ELEMENT, "TABLE_ELEMENT")
                , root_1);

                adaptor.addChild(root_1, stream_insert_into_clause.nextTree());

                // PLSQL_DMLParser.g:589:47: ( values_clause )?
                if ( stream_values_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_values_clause.nextTree());

                }
                stream_values_clause.reset();

                // PLSQL_DMLParser.g:589:62: ( error_logging_clause )?
                if ( stream_error_logging_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_error_logging_clause.nextTree());

                }
                stream_error_logging_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "multi_table_element"


    public static class conditional_insert_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "conditional_insert_clause"
    // PLSQL_DMLParser.g:592:1: conditional_insert_clause : ( all_key | first_key )? ( conditional_insert_when_part )+ ( conditional_insert_else_part )? -> ^( CONDITIONAL_INSERT ( all_key )? ( first_key )? ( conditional_insert_when_part )+ ( conditional_insert_else_part )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.conditional_insert_clause_return conditional_insert_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.conditional_insert_clause_return retval = new PLSQLParser_PLSQL_DMLParser.conditional_insert_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.all_key_return all_key361 =null;

        PLSQLParser_PLSQLKeys.first_key_return first_key362 =null;

        PLSQLParser_PLSQL_DMLParser.conditional_insert_when_part_return conditional_insert_when_part363 =null;

        PLSQLParser_PLSQL_DMLParser.conditional_insert_else_part_return conditional_insert_else_part364 =null;


        RewriteRuleSubtreeStream stream_all_key=new RewriteRuleSubtreeStream(adaptor,"rule all_key");
        RewriteRuleSubtreeStream stream_conditional_insert_when_part=new RewriteRuleSubtreeStream(adaptor,"rule conditional_insert_when_part");
        RewriteRuleSubtreeStream stream_conditional_insert_else_part=new RewriteRuleSubtreeStream(adaptor,"rule conditional_insert_else_part");
        RewriteRuleSubtreeStream stream_first_key=new RewriteRuleSubtreeStream(adaptor,"rule first_key");
        try {
            // PLSQL_DMLParser.g:593:5: ( ( all_key | first_key )? ( conditional_insert_when_part )+ ( conditional_insert_else_part )? -> ^( CONDITIONAL_INSERT ( all_key )? ( first_key )? ( conditional_insert_when_part )+ ( conditional_insert_else_part )? ) )
            // PLSQL_DMLParser.g:593:10: ( all_key | first_key )? ( conditional_insert_when_part )+ ( conditional_insert_else_part )?
            {
            // PLSQL_DMLParser.g:593:10: ( all_key | first_key )?
            int alt122=3;
            int LA122_0 = input.LA(1);

            if ( (LA122_0==SQL92_RESERVED_ALL) ) {
                alt122=1;
            }
            else if ( (LA122_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("first")))) {
                alt122=2;
            }
            switch (alt122) {
                case 1 :
                    // PLSQL_DMLParser.g:593:11: all_key
                    {
                    pushFollow(FOLLOW_all_key_in_conditional_insert_clause5120);
                    all_key361=gPLSQLParser.all_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_all_key.add(all_key361.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:593:19: first_key
                    {
                    pushFollow(FOLLOW_first_key_in_conditional_insert_clause5122);
                    first_key362=gPLSQLParser.first_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_first_key.add(first_key362.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:594:9: ( conditional_insert_when_part )+
            int cnt123=0;
            loop123:
            do {
                int alt123=2;
                int LA123_0 = input.LA(1);

                if ( (LA123_0==SQL92_RESERVED_WHEN) ) {
                    alt123=1;
                }


                switch (alt123) {
            	case 1 :
            	    // PLSQL_DMLParser.g:594:9: conditional_insert_when_part
            	    {
            	    pushFollow(FOLLOW_conditional_insert_when_part_in_conditional_insert_clause5134);
            	    conditional_insert_when_part363=conditional_insert_when_part();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_conditional_insert_when_part.add(conditional_insert_when_part363.getTree());

            	    }
            	    break;

            	default :
            	    if ( cnt123 >= 1 ) break loop123;
            	    if (state.backtracking>0) {state.failed=true; return retval;}
                        EarlyExitException eee =
                            new EarlyExitException(123, input);
                        throw eee;
                }
                cnt123++;
            } while (true);


            // PLSQL_DMLParser.g:594:39: ( conditional_insert_else_part )?
            int alt124=2;
            int LA124_0 = input.LA(1);

            if ( (LA124_0==SQL92_RESERVED_ELSE) ) {
                alt124=1;
            }
            switch (alt124) {
                case 1 :
                    // PLSQL_DMLParser.g:594:39: conditional_insert_else_part
                    {
                    pushFollow(FOLLOW_conditional_insert_else_part_in_conditional_insert_clause5137);
                    conditional_insert_else_part364=conditional_insert_else_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_conditional_insert_else_part.add(conditional_insert_else_part364.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: first_key, conditional_insert_else_part, all_key, conditional_insert_when_part
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 595:9: -> ^( CONDITIONAL_INSERT ( all_key )? ( first_key )? ( conditional_insert_when_part )+ ( conditional_insert_else_part )? )
            {
                // PLSQL_DMLParser.g:595:12: ^( CONDITIONAL_INSERT ( all_key )? ( first_key )? ( conditional_insert_when_part )+ ( conditional_insert_else_part )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(CONDITIONAL_INSERT, "CONDITIONAL_INSERT")
                , root_1);

                // PLSQL_DMLParser.g:595:33: ( all_key )?
                if ( stream_all_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_all_key.nextTree());

                }
                stream_all_key.reset();

                // PLSQL_DMLParser.g:595:42: ( first_key )?
                if ( stream_first_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_first_key.nextTree());

                }
                stream_first_key.reset();

                if ( !(stream_conditional_insert_when_part.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_conditional_insert_when_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_conditional_insert_when_part.nextTree());

                }
                stream_conditional_insert_when_part.reset();

                // PLSQL_DMLParser.g:595:83: ( conditional_insert_else_part )?
                if ( stream_conditional_insert_else_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_conditional_insert_else_part.nextTree());

                }
                stream_conditional_insert_else_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "conditional_insert_clause"


    public static class conditional_insert_when_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "conditional_insert_when_part"
    // PLSQL_DMLParser.g:598:1: conditional_insert_when_part : when_key condition then_key ( multi_table_element )+ -> ^( when_key ^( LOGIC_EXPR condition ) ( multi_table_element )+ ) ;
    public final PLSQLParser_PLSQL_DMLParser.conditional_insert_when_part_return conditional_insert_when_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.conditional_insert_when_part_return retval = new PLSQLParser_PLSQL_DMLParser.conditional_insert_when_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.when_key_return when_key365 =null;

        PLSQLParser_PLSQL_DMLParser.condition_return condition366 =null;

        PLSQLParser_PLSQLKeys.then_key_return then_key367 =null;

        PLSQLParser_PLSQL_DMLParser.multi_table_element_return multi_table_element368 =null;


        RewriteRuleSubtreeStream stream_then_key=new RewriteRuleSubtreeStream(adaptor,"rule then_key");
        RewriteRuleSubtreeStream stream_condition=new RewriteRuleSubtreeStream(adaptor,"rule condition");
        RewriteRuleSubtreeStream stream_multi_table_element=new RewriteRuleSubtreeStream(adaptor,"rule multi_table_element");
        RewriteRuleSubtreeStream stream_when_key=new RewriteRuleSubtreeStream(adaptor,"rule when_key");
        try {
            // PLSQL_DMLParser.g:599:5: ( when_key condition then_key ( multi_table_element )+ -> ^( when_key ^( LOGIC_EXPR condition ) ( multi_table_element )+ ) )
            // PLSQL_DMLParser.g:599:10: when_key condition then_key ( multi_table_element )+
            {
            pushFollow(FOLLOW_when_key_in_conditional_insert_when_part5185);
            when_key365=gPLSQLParser.when_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_when_key.add(when_key365.getTree());

            pushFollow(FOLLOW_condition_in_conditional_insert_when_part5187);
            condition366=condition();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_condition.add(condition366.getTree());

            pushFollow(FOLLOW_then_key_in_conditional_insert_when_part5189);
            then_key367=gPLSQLParser.then_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_then_key.add(then_key367.getTree());

            // PLSQL_DMLParser.g:599:38: ( multi_table_element )+
            int cnt125=0;
            loop125:
            do {
                int alt125=2;
                int LA125_0 = input.LA(1);

                if ( (LA125_0==SQL92_RESERVED_INTO) ) {
                    alt125=1;
                }


                switch (alt125) {
            	case 1 :
            	    // PLSQL_DMLParser.g:599:38: multi_table_element
            	    {
            	    pushFollow(FOLLOW_multi_table_element_in_conditional_insert_when_part5191);
            	    multi_table_element368=multi_table_element();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_multi_table_element.add(multi_table_element368.getTree());

            	    }
            	    break;

            	default :
            	    if ( cnt125 >= 1 ) break loop125;
            	    if (state.backtracking>0) {state.failed=true; return retval;}
                        EarlyExitException eee =
                            new EarlyExitException(125, input);
                        throw eee;
                }
                cnt125++;
            } while (true);


            // AST REWRITE
            // elements: multi_table_element, condition, when_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 600:9: -> ^( when_key ^( LOGIC_EXPR condition ) ( multi_table_element )+ )
            {
                // PLSQL_DMLParser.g:600:12: ^( when_key ^( LOGIC_EXPR condition ) ( multi_table_element )+ )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_when_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:600:23: ^( LOGIC_EXPR condition )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(LOGIC_EXPR, "LOGIC_EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_condition.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                if ( !(stream_multi_table_element.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_multi_table_element.hasNext() ) {
                    adaptor.addChild(root_1, stream_multi_table_element.nextTree());

                }
                stream_multi_table_element.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "conditional_insert_when_part"


    public static class conditional_insert_else_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "conditional_insert_else_part"
    // PLSQL_DMLParser.g:603:1: conditional_insert_else_part : else_key ^ ( multi_table_element )+ ;
    public final PLSQLParser_PLSQL_DMLParser.conditional_insert_else_part_return conditional_insert_else_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.conditional_insert_else_part_return retval = new PLSQLParser_PLSQL_DMLParser.conditional_insert_else_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.else_key_return else_key369 =null;

        PLSQLParser_PLSQL_DMLParser.multi_table_element_return multi_table_element370 =null;



        try {
            // PLSQL_DMLParser.g:604:5: ( else_key ^ ( multi_table_element )+ )
            // PLSQL_DMLParser.g:604:10: else_key ^ ( multi_table_element )+
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_else_key_in_conditional_insert_else_part5235);
            else_key369=gPLSQLParser.else_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(else_key369.getTree(), root_0);

            // PLSQL_DMLParser.g:604:20: ( multi_table_element )+
            int cnt126=0;
            loop126:
            do {
                int alt126=2;
                int LA126_0 = input.LA(1);

                if ( (LA126_0==SQL92_RESERVED_INTO) ) {
                    alt126=1;
                }


                switch (alt126) {
            	case 1 :
            	    // PLSQL_DMLParser.g:604:20: multi_table_element
            	    {
            	    pushFollow(FOLLOW_multi_table_element_in_conditional_insert_else_part5238);
            	    multi_table_element370=multi_table_element();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, multi_table_element370.getTree());

            	    }
            	    break;

            	default :
            	    if ( cnt126 >= 1 ) break loop126;
            	    if (state.backtracking>0) {state.failed=true; return retval;}
                        EarlyExitException eee =
                            new EarlyExitException(126, input);
                        throw eee;
                }
                cnt126++;
            } while (true);


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "conditional_insert_else_part"


    public static class insert_into_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "insert_into_clause"
    // PLSQL_DMLParser.g:607:1: insert_into_clause : into_key general_table_ref ( LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN )? -> ^( into_key general_table_ref ^( COLUMNS ( column_name )* ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.insert_into_clause_return insert_into_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.insert_into_clause_return retval = new PLSQLParser_PLSQL_DMLParser.insert_into_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN373=null;
        Token COMMA375=null;
        Token RIGHT_PAREN377=null;
        PLSQLParser_PLSQLKeys.into_key_return into_key371 =null;

        PLSQLParser_PLSQL_DMLParser.general_table_ref_return general_table_ref372 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name374 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name376 =null;


        Object LEFT_PAREN373_tree=null;
        Object COMMA375_tree=null;
        Object RIGHT_PAREN377_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_general_table_ref=new RewriteRuleSubtreeStream(adaptor,"rule general_table_ref");
        RewriteRuleSubtreeStream stream_into_key=new RewriteRuleSubtreeStream(adaptor,"rule into_key");
        RewriteRuleSubtreeStream stream_column_name=new RewriteRuleSubtreeStream(adaptor,"rule column_name");
        try {
            // PLSQL_DMLParser.g:608:5: ( into_key general_table_ref ( LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN )? -> ^( into_key general_table_ref ^( COLUMNS ( column_name )* ) ) )
            // PLSQL_DMLParser.g:608:10: into_key general_table_ref ( LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN )?
            {
            pushFollow(FOLLOW_into_key_in_insert_into_clause5259);
            into_key371=gPLSQLParser.into_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_into_key.add(into_key371.getTree());

            pushFollow(FOLLOW_general_table_ref_in_insert_into_clause5261);
            general_table_ref372=general_table_ref();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_general_table_ref.add(general_table_ref372.getTree());

            // PLSQL_DMLParser.g:609:9: ( LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN )?
            int alt128=2;
            int LA128_0 = input.LA(1);

            if ( (LA128_0==LEFT_PAREN) ) {
                int LA128_1 = input.LA(2);

                if ( (LA128_1==DELIMITED_ID||LA128_1==INTRODUCER||LA128_1==REGULAR_ID) ) {
                    alt128=1;
                }
            }
            switch (alt128) {
                case 1 :
                    // PLSQL_DMLParser.g:609:10: LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN
                    {
                    LEFT_PAREN373=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_insert_into_clause5273); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN373);


                    pushFollow(FOLLOW_column_name_in_insert_into_clause5275);
                    column_name374=gPLSQLParser.column_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_column_name.add(column_name374.getTree());

                    // PLSQL_DMLParser.g:609:33: ( COMMA column_name )*
                    loop127:
                    do {
                        int alt127=2;
                        int LA127_0 = input.LA(1);

                        if ( (LA127_0==COMMA) ) {
                            alt127=1;
                        }


                        switch (alt127) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:609:34: COMMA column_name
                    	    {
                    	    COMMA375=(Token)match(input,COMMA,FOLLOW_COMMA_in_insert_into_clause5278); if (state.failed) return retval; 
                    	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA375);


                    	    pushFollow(FOLLOW_column_name_in_insert_into_clause5280);
                    	    column_name376=gPLSQLParser.column_name();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_column_name.add(column_name376.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop127;
                        }
                    } while (true);


                    RIGHT_PAREN377=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_insert_into_clause5284); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN377);


                    }
                    break;

            }


            // AST REWRITE
            // elements: column_name, general_table_ref, into_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 610:9: -> ^( into_key general_table_ref ^( COLUMNS ( column_name )* ) )
            {
                // PLSQL_DMLParser.g:610:12: ^( into_key general_table_ref ^( COLUMNS ( column_name )* ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_into_key.nextNode(), root_1);

                adaptor.addChild(root_1, stream_general_table_ref.nextTree());

                // PLSQL_DMLParser.g:610:41: ^( COLUMNS ( column_name )* )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(COLUMNS, "COLUMNS")
                , root_2);

                // PLSQL_DMLParser.g:610:51: ( column_name )*
                while ( stream_column_name.hasNext() ) {
                    adaptor.addChild(root_2, stream_column_name.nextTree());

                }
                stream_column_name.reset();

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "insert_into_clause"


    public static class values_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "values_clause"
    // PLSQL_DMLParser.g:613:1: values_clause : values_key ^ expression_list ;
    public final PLSQLParser_PLSQL_DMLParser.values_clause_return values_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.values_clause_return retval = new PLSQLParser_PLSQL_DMLParser.values_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.values_key_return values_key378 =null;

        PLSQLParser_PLSQL_DMLParser.expression_list_return expression_list379 =null;



        try {
            // PLSQL_DMLParser.g:614:5: ( values_key ^ expression_list )
            // PLSQL_DMLParser.g:614:10: values_key ^ expression_list
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_values_key_in_values_clause5329);
            values_key378=gPLSQLParser.values_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(values_key378.getTree(), root_0);

            pushFollow(FOLLOW_expression_list_in_values_clause5332);
            expression_list379=expression_list();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_list379.getTree());

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "values_clause"


    public static class merge_statement_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "merge_statement"
    // PLSQL_DMLParser.g:618:1: merge_statement : merge_key into_key tableview_name ( alias )? using_key selected_tableview on_key LEFT_PAREN condition RIGHT_PAREN ( merge_update_clause )? ( merge_insert_clause )? ( error_logging_clause )? -> ^( merge_key ( alias )? tableview_name ^( using_key selected_tableview ^( LOGIC_EXPR condition ) ) ( merge_update_clause )? ( merge_insert_clause )? ( error_logging_clause )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.merge_statement_return merge_statement() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.merge_statement_return retval = new PLSQLParser_PLSQL_DMLParser.merge_statement_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN387=null;
        Token RIGHT_PAREN389=null;
        PLSQLParser_PLSQLKeys.merge_key_return merge_key380 =null;

        PLSQLParser_PLSQLKeys.into_key_return into_key381 =null;

        PLSQLParser_PLSQLCommons.tableview_name_return tableview_name382 =null;

        PLSQLParser_PLSQLCommons.alias_return alias383 =null;

        PLSQLParser_PLSQLKeys.using_key_return using_key384 =null;

        PLSQLParser_PLSQL_DMLParser.selected_tableview_return selected_tableview385 =null;

        PLSQLParser_PLSQLKeys.on_key_return on_key386 =null;

        PLSQLParser_PLSQL_DMLParser.condition_return condition388 =null;

        PLSQLParser_PLSQL_DMLParser.merge_update_clause_return merge_update_clause390 =null;

        PLSQLParser_PLSQL_DMLParser.merge_insert_clause_return merge_insert_clause391 =null;

        PLSQLParser_PLSQL_DMLParser.error_logging_clause_return error_logging_clause392 =null;


        Object LEFT_PAREN387_tree=null;
        Object RIGHT_PAREN389_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleSubtreeStream stream_using_key=new RewriteRuleSubtreeStream(adaptor,"rule using_key");
        RewriteRuleSubtreeStream stream_merge_insert_clause=new RewriteRuleSubtreeStream(adaptor,"rule merge_insert_clause");
        RewriteRuleSubtreeStream stream_into_key=new RewriteRuleSubtreeStream(adaptor,"rule into_key");
        RewriteRuleSubtreeStream stream_merge_key=new RewriteRuleSubtreeStream(adaptor,"rule merge_key");
        RewriteRuleSubtreeStream stream_merge_update_clause=new RewriteRuleSubtreeStream(adaptor,"rule merge_update_clause");
        RewriteRuleSubtreeStream stream_error_logging_clause=new RewriteRuleSubtreeStream(adaptor,"rule error_logging_clause");
        RewriteRuleSubtreeStream stream_alias=new RewriteRuleSubtreeStream(adaptor,"rule alias");
        RewriteRuleSubtreeStream stream_condition=new RewriteRuleSubtreeStream(adaptor,"rule condition");
        RewriteRuleSubtreeStream stream_selected_tableview=new RewriteRuleSubtreeStream(adaptor,"rule selected_tableview");
        RewriteRuleSubtreeStream stream_on_key=new RewriteRuleSubtreeStream(adaptor,"rule on_key");
        RewriteRuleSubtreeStream stream_tableview_name=new RewriteRuleSubtreeStream(adaptor,"rule tableview_name");
        try {
            // PLSQL_DMLParser.g:619:5: ( merge_key into_key tableview_name ( alias )? using_key selected_tableview on_key LEFT_PAREN condition RIGHT_PAREN ( merge_update_clause )? ( merge_insert_clause )? ( error_logging_clause )? -> ^( merge_key ( alias )? tableview_name ^( using_key selected_tableview ^( LOGIC_EXPR condition ) ) ( merge_update_clause )? ( merge_insert_clause )? ( error_logging_clause )? ) )
            // PLSQL_DMLParser.g:619:10: merge_key into_key tableview_name ( alias )? using_key selected_tableview on_key LEFT_PAREN condition RIGHT_PAREN ( merge_update_clause )? ( merge_insert_clause )? ( error_logging_clause )?
            {
            pushFollow(FOLLOW_merge_key_in_merge_statement5353);
            merge_key380=gPLSQLParser.merge_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_merge_key.add(merge_key380.getTree());

            pushFollow(FOLLOW_into_key_in_merge_statement5355);
            into_key381=gPLSQLParser.into_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_into_key.add(into_key381.getTree());

            pushFollow(FOLLOW_tableview_name_in_merge_statement5357);
            tableview_name382=gPLSQLParser.tableview_name();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_tableview_name.add(tableview_name382.getTree());

            // PLSQL_DMLParser.g:619:44: ( alias )?
            int alt129=2;
            int LA129_0 = input.LA(1);

            if ( (LA129_0==CHAR_STRING||LA129_0==DELIMITED_ID||LA129_0==INTRODUCER||LA129_0==REGULAR_ID||LA129_0==SQL92_RESERVED_AS) ) {
                alt129=1;
            }
            switch (alt129) {
                case 1 :
                    // PLSQL_DMLParser.g:619:44: alias
                    {
                    pushFollow(FOLLOW_alias_in_merge_statement5359);
                    alias383=gPLSQLParser.alias();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_alias.add(alias383.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_using_key_in_merge_statement5370);
            using_key384=gPLSQLParser.using_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_using_key.add(using_key384.getTree());

            pushFollow(FOLLOW_selected_tableview_in_merge_statement5372);
            selected_tableview385=selected_tableview();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_selected_tableview.add(selected_tableview385.getTree());

            pushFollow(FOLLOW_on_key_in_merge_statement5374);
            on_key386=gPLSQLParser.on_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_on_key.add(on_key386.getTree());

            LEFT_PAREN387=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_merge_statement5376); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN387);


            pushFollow(FOLLOW_condition_in_merge_statement5378);
            condition388=condition();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_condition.add(condition388.getTree());

            RIGHT_PAREN389=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_merge_statement5380); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN389);


            // PLSQL_DMLParser.g:621:9: ( merge_update_clause )?
            int alt130=2;
            alt130 = dfa130.predict(input);
            switch (alt130) {
                case 1 :
                    // PLSQL_DMLParser.g:621:9: merge_update_clause
                    {
                    pushFollow(FOLLOW_merge_update_clause_in_merge_statement5390);
                    merge_update_clause390=merge_update_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_merge_update_clause.add(merge_update_clause390.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:621:30: ( merge_insert_clause )?
            int alt131=2;
            int LA131_0 = input.LA(1);

            if ( (LA131_0==SQL92_RESERVED_WHEN) ) {
                int LA131_1 = input.LA(2);

                if ( (LA131_1==SQL92_RESERVED_NOT) ) {
                    int LA131_3 = input.LA(3);

                    if ( (LA131_3==REGULAR_ID) ) {
                        int LA131_4 = input.LA(4);

                        if ( (LA131_4==SQL92_RESERVED_THEN) ) {
                            int LA131_5 = input.LA(5);

                            if ( (LA131_5==SQL92_RESERVED_INSERT) ) {
                                int LA131_6 = input.LA(6);

                                if ( (LA131_6==LEFT_PAREN||LA131_6==SQL92_RESERVED_VALUES) ) {
                                    alt131=1;
                                }
                            }
                        }
                    }
                }
            }
            switch (alt131) {
                case 1 :
                    // PLSQL_DMLParser.g:621:30: merge_insert_clause
                    {
                    pushFollow(FOLLOW_merge_insert_clause_in_merge_statement5393);
                    merge_insert_clause391=merge_insert_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_merge_insert_clause.add(merge_insert_clause391.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:621:51: ( error_logging_clause )?
            int alt132=2;
            int LA132_0 = input.LA(1);

            if ( (LA132_0==REGULAR_ID) ) {
                int LA132_1 = input.LA(2);

                if ( (LA132_1==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("log")))) {
                    alt132=1;
                }
            }
            switch (alt132) {
                case 1 :
                    // PLSQL_DMLParser.g:621:51: error_logging_clause
                    {
                    pushFollow(FOLLOW_error_logging_clause_in_merge_statement5396);
                    error_logging_clause392=error_logging_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_error_logging_clause.add(error_logging_clause392.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: merge_update_clause, selected_tableview, using_key, alias, tableview_name, error_logging_clause, condition, merge_insert_clause, merge_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 622:9: -> ^( merge_key ( alias )? tableview_name ^( using_key selected_tableview ^( LOGIC_EXPR condition ) ) ( merge_update_clause )? ( merge_insert_clause )? ( error_logging_clause )? )
            {
                // PLSQL_DMLParser.g:622:12: ^( merge_key ( alias )? tableview_name ^( using_key selected_tableview ^( LOGIC_EXPR condition ) ) ( merge_update_clause )? ( merge_insert_clause )? ( error_logging_clause )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_merge_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:622:24: ( alias )?
                if ( stream_alias.hasNext() ) {
                    adaptor.addChild(root_1, stream_alias.nextTree());

                }
                stream_alias.reset();

                adaptor.addChild(root_1, stream_tableview_name.nextTree());

                // PLSQL_DMLParser.g:622:46: ^( using_key selected_tableview ^( LOGIC_EXPR condition ) )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_using_key.nextNode(), root_2);

                adaptor.addChild(root_2, stream_selected_tableview.nextTree());

                // PLSQL_DMLParser.g:622:77: ^( LOGIC_EXPR condition )
                {
                Object root_3 = (Object)adaptor.nil();
                root_3 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(LOGIC_EXPR, "LOGIC_EXPR")
                , root_3);

                adaptor.addChild(root_3, stream_condition.nextTree());

                adaptor.addChild(root_2, root_3);
                }

                adaptor.addChild(root_1, root_2);
                }

                // PLSQL_DMLParser.g:623:18: ( merge_update_clause )?
                if ( stream_merge_update_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_merge_update_clause.nextTree());

                }
                stream_merge_update_clause.reset();

                // PLSQL_DMLParser.g:623:39: ( merge_insert_clause )?
                if ( stream_merge_insert_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_merge_insert_clause.nextTree());

                }
                stream_merge_insert_clause.reset();

                // PLSQL_DMLParser.g:623:60: ( error_logging_clause )?
                if ( stream_error_logging_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_error_logging_clause.nextTree());

                }
                stream_error_logging_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "merge_statement"


    public static class merge_update_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "merge_update_clause"
    // PLSQL_DMLParser.g:628:1: merge_update_clause : when_key matched_key then_key update_key set_key merge_element ( COMMA merge_element )* ( where_clause )? ( merge_update_delete_part )? -> ^( MERGE_UPDATE ( merge_element )+ ( where_clause )? ( merge_update_delete_part )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.merge_update_clause_return merge_update_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.merge_update_clause_return retval = new PLSQLParser_PLSQL_DMLParser.merge_update_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COMMA399=null;
        PLSQLParser_PLSQLKeys.when_key_return when_key393 =null;

        PLSQLParser_PLSQLKeys.matched_key_return matched_key394 =null;

        PLSQLParser_PLSQLKeys.then_key_return then_key395 =null;

        PLSQLParser_PLSQLKeys.update_key_return update_key396 =null;

        PLSQLParser_PLSQLKeys.set_key_return set_key397 =null;

        PLSQLParser_PLSQL_DMLParser.merge_element_return merge_element398 =null;

        PLSQLParser_PLSQL_DMLParser.merge_element_return merge_element400 =null;

        PLSQLParser_PLSQLCommons.where_clause_return where_clause401 =null;

        PLSQLParser_PLSQL_DMLParser.merge_update_delete_part_return merge_update_delete_part402 =null;


        Object COMMA399_tree=null;
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_then_key=new RewriteRuleSubtreeStream(adaptor,"rule then_key");
        RewriteRuleSubtreeStream stream_merge_update_delete_part=new RewriteRuleSubtreeStream(adaptor,"rule merge_update_delete_part");
        RewriteRuleSubtreeStream stream_merge_element=new RewriteRuleSubtreeStream(adaptor,"rule merge_element");
        RewriteRuleSubtreeStream stream_where_clause=new RewriteRuleSubtreeStream(adaptor,"rule where_clause");
        RewriteRuleSubtreeStream stream_set_key=new RewriteRuleSubtreeStream(adaptor,"rule set_key");
        RewriteRuleSubtreeStream stream_update_key=new RewriteRuleSubtreeStream(adaptor,"rule update_key");
        RewriteRuleSubtreeStream stream_when_key=new RewriteRuleSubtreeStream(adaptor,"rule when_key");
        RewriteRuleSubtreeStream stream_matched_key=new RewriteRuleSubtreeStream(adaptor,"rule matched_key");
        try {
            // PLSQL_DMLParser.g:629:5: ( when_key matched_key then_key update_key set_key merge_element ( COMMA merge_element )* ( where_clause )? ( merge_update_delete_part )? -> ^( MERGE_UPDATE ( merge_element )+ ( where_clause )? ( merge_update_delete_part )? ) )
            // PLSQL_DMLParser.g:629:10: when_key matched_key then_key update_key set_key merge_element ( COMMA merge_element )* ( where_clause )? ( merge_update_delete_part )?
            {
            pushFollow(FOLLOW_when_key_in_merge_update_clause5476);
            when_key393=gPLSQLParser.when_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_when_key.add(when_key393.getTree());

            pushFollow(FOLLOW_matched_key_in_merge_update_clause5478);
            matched_key394=gPLSQLParser.matched_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_matched_key.add(matched_key394.getTree());

            pushFollow(FOLLOW_then_key_in_merge_update_clause5480);
            then_key395=gPLSQLParser.then_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_then_key.add(then_key395.getTree());

            pushFollow(FOLLOW_update_key_in_merge_update_clause5482);
            update_key396=gPLSQLParser.update_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_update_key.add(update_key396.getTree());

            pushFollow(FOLLOW_set_key_in_merge_update_clause5484);
            set_key397=gPLSQLParser.set_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_set_key.add(set_key397.getTree());

            pushFollow(FOLLOW_merge_element_in_merge_update_clause5495);
            merge_element398=merge_element();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_merge_element.add(merge_element398.getTree());

            // PLSQL_DMLParser.g:630:23: ( COMMA merge_element )*
            loop133:
            do {
                int alt133=2;
                int LA133_0 = input.LA(1);

                if ( (LA133_0==COMMA) ) {
                    alt133=1;
                }


                switch (alt133) {
            	case 1 :
            	    // PLSQL_DMLParser.g:630:24: COMMA merge_element
            	    {
            	    COMMA399=(Token)match(input,COMMA,FOLLOW_COMMA_in_merge_update_clause5498); if (state.failed) return retval; 
            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA399);


            	    pushFollow(FOLLOW_merge_element_in_merge_update_clause5500);
            	    merge_element400=merge_element();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_merge_element.add(merge_element400.getTree());

            	    }
            	    break;

            	default :
            	    break loop133;
                }
            } while (true);


            // PLSQL_DMLParser.g:631:9: ( where_clause )?
            int alt134=2;
            int LA134_0 = input.LA(1);

            if ( (LA134_0==SQL92_RESERVED_WHERE) ) {
                alt134=1;
            }
            switch (alt134) {
                case 1 :
                    // PLSQL_DMLParser.g:631:9: where_clause
                    {
                    pushFollow(FOLLOW_where_clause_in_merge_update_clause5512);
                    where_clause401=gPLSQLParser.where_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_where_clause.add(where_clause401.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:631:23: ( merge_update_delete_part )?
            int alt135=2;
            int LA135_0 = input.LA(1);

            if ( (LA135_0==SQL92_RESERVED_DELETE) ) {
                int LA135_1 = input.LA(2);

                if ( (LA135_1==SQL92_RESERVED_WHERE) ) {
                    alt135=1;
                }
            }
            switch (alt135) {
                case 1 :
                    // PLSQL_DMLParser.g:631:23: merge_update_delete_part
                    {
                    pushFollow(FOLLOW_merge_update_delete_part_in_merge_update_clause5515);
                    merge_update_delete_part402=merge_update_delete_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_merge_update_delete_part.add(merge_update_delete_part402.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: merge_element, merge_update_delete_part, where_clause
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 632:9: -> ^( MERGE_UPDATE ( merge_element )+ ( where_clause )? ( merge_update_delete_part )? )
            {
                // PLSQL_DMLParser.g:632:11: ^( MERGE_UPDATE ( merge_element )+ ( where_clause )? ( merge_update_delete_part )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(MERGE_UPDATE, "MERGE_UPDATE")
                , root_1);

                if ( !(stream_merge_element.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_merge_element.hasNext() ) {
                    adaptor.addChild(root_1, stream_merge_element.nextTree());

                }
                stream_merge_element.reset();

                // PLSQL_DMLParser.g:632:41: ( where_clause )?
                if ( stream_where_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_where_clause.nextTree());

                }
                stream_where_clause.reset();

                // PLSQL_DMLParser.g:632:55: ( merge_update_delete_part )?
                if ( stream_merge_update_delete_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_merge_update_delete_part.nextTree());

                }
                stream_merge_update_delete_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "merge_update_clause"


    public static class merge_element_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "merge_element"
    // PLSQL_DMLParser.g:635:1: merge_element : column_name EQUALS_OP expression -> ^( ASSIGN[$EQUALS_OP] column_name ^( EXPR expression ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.merge_element_return merge_element() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.merge_element_return retval = new PLSQLParser_PLSQL_DMLParser.merge_element_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token EQUALS_OP404=null;
        PLSQLParser_PLSQLCommons.column_name_return column_name403 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression405 =null;


        Object EQUALS_OP404_tree=null;
        RewriteRuleTokenStream stream_EQUALS_OP=new RewriteRuleTokenStream(adaptor,"token EQUALS_OP");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_column_name=new RewriteRuleSubtreeStream(adaptor,"rule column_name");
        try {
            // PLSQL_DMLParser.g:636:5: ( column_name EQUALS_OP expression -> ^( ASSIGN[$EQUALS_OP] column_name ^( EXPR expression ) ) )
            // PLSQL_DMLParser.g:636:10: column_name EQUALS_OP expression
            {
            pushFollow(FOLLOW_column_name_in_merge_element5558);
            column_name403=gPLSQLParser.column_name();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_column_name.add(column_name403.getTree());

            EQUALS_OP404=(Token)match(input,EQUALS_OP,FOLLOW_EQUALS_OP_in_merge_element5560); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_EQUALS_OP.add(EQUALS_OP404);


            pushFollow(FOLLOW_expression_in_merge_element5562);
            expression405=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression405.getTree());

            // AST REWRITE
            // elements: expression, column_name
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 637:9: -> ^( ASSIGN[$EQUALS_OP] column_name ^( EXPR expression ) )
            {
                // PLSQL_DMLParser.g:637:12: ^( ASSIGN[$EQUALS_OP] column_name ^( EXPR expression ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(ASSIGN, EQUALS_OP404)
                , root_1);

                adaptor.addChild(root_1, stream_column_name.nextTree());

                // PLSQL_DMLParser.g:637:45: ^( EXPR expression )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_expression.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "merge_element"


    public static class merge_update_delete_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "merge_update_delete_part"
    // PLSQL_DMLParser.g:640:1: merge_update_delete_part : delete_key ^ where_clause ;
    public final PLSQLParser_PLSQL_DMLParser.merge_update_delete_part_return merge_update_delete_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.merge_update_delete_part_return retval = new PLSQLParser_PLSQL_DMLParser.merge_update_delete_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.delete_key_return delete_key406 =null;

        PLSQLParser_PLSQLCommons.where_clause_return where_clause407 =null;



        try {
            // PLSQL_DMLParser.g:641:5: ( delete_key ^ where_clause )
            // PLSQL_DMLParser.g:641:10: delete_key ^ where_clause
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_delete_key_in_merge_update_delete_part5605);
            delete_key406=gPLSQLParser.delete_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(delete_key406.getTree(), root_0);

            pushFollow(FOLLOW_where_clause_in_merge_update_delete_part5608);
            where_clause407=gPLSQLParser.where_clause();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, where_clause407.getTree());

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "merge_update_delete_part"


    public static class merge_insert_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "merge_insert_clause"
    // PLSQL_DMLParser.g:644:1: merge_insert_clause : when_key not_key matched_key then_key insert_key ( LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN )? values_key expression_list ( where_clause )? -> ^( MERGE_INSERT ^( COLUMNS ( column_name )* ) expression_list ( where_clause )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.merge_insert_clause_return merge_insert_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.merge_insert_clause_return retval = new PLSQLParser_PLSQL_DMLParser.merge_insert_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN413=null;
        Token COMMA415=null;
        Token RIGHT_PAREN417=null;
        PLSQLParser_PLSQLKeys.when_key_return when_key408 =null;

        PLSQLParser_PLSQLKeys.not_key_return not_key409 =null;

        PLSQLParser_PLSQLKeys.matched_key_return matched_key410 =null;

        PLSQLParser_PLSQLKeys.then_key_return then_key411 =null;

        PLSQLParser_PLSQLKeys.insert_key_return insert_key412 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name414 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name416 =null;

        PLSQLParser_PLSQLKeys.values_key_return values_key418 =null;

        PLSQLParser_PLSQL_DMLParser.expression_list_return expression_list419 =null;

        PLSQLParser_PLSQLCommons.where_clause_return where_clause420 =null;


        Object LEFT_PAREN413_tree=null;
        Object COMMA415_tree=null;
        Object RIGHT_PAREN417_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_then_key=new RewriteRuleSubtreeStream(adaptor,"rule then_key");
        RewriteRuleSubtreeStream stream_expression_list=new RewriteRuleSubtreeStream(adaptor,"rule expression_list");
        RewriteRuleSubtreeStream stream_insert_key=new RewriteRuleSubtreeStream(adaptor,"rule insert_key");
        RewriteRuleSubtreeStream stream_values_key=new RewriteRuleSubtreeStream(adaptor,"rule values_key");
        RewriteRuleSubtreeStream stream_where_clause=new RewriteRuleSubtreeStream(adaptor,"rule where_clause");
        RewriteRuleSubtreeStream stream_not_key=new RewriteRuleSubtreeStream(adaptor,"rule not_key");
        RewriteRuleSubtreeStream stream_column_name=new RewriteRuleSubtreeStream(adaptor,"rule column_name");
        RewriteRuleSubtreeStream stream_when_key=new RewriteRuleSubtreeStream(adaptor,"rule when_key");
        RewriteRuleSubtreeStream stream_matched_key=new RewriteRuleSubtreeStream(adaptor,"rule matched_key");
        try {
            // PLSQL_DMLParser.g:645:5: ( when_key not_key matched_key then_key insert_key ( LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN )? values_key expression_list ( where_clause )? -> ^( MERGE_INSERT ^( COLUMNS ( column_name )* ) expression_list ( where_clause )? ) )
            // PLSQL_DMLParser.g:645:10: when_key not_key matched_key then_key insert_key ( LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN )? values_key expression_list ( where_clause )?
            {
            pushFollow(FOLLOW_when_key_in_merge_insert_clause5628);
            when_key408=gPLSQLParser.when_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_when_key.add(when_key408.getTree());

            pushFollow(FOLLOW_not_key_in_merge_insert_clause5630);
            not_key409=gPLSQLParser.not_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_not_key.add(not_key409.getTree());

            pushFollow(FOLLOW_matched_key_in_merge_insert_clause5632);
            matched_key410=gPLSQLParser.matched_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_matched_key.add(matched_key410.getTree());

            pushFollow(FOLLOW_then_key_in_merge_insert_clause5634);
            then_key411=gPLSQLParser.then_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_then_key.add(then_key411.getTree());

            pushFollow(FOLLOW_insert_key_in_merge_insert_clause5636);
            insert_key412=gPLSQLParser.insert_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_insert_key.add(insert_key412.getTree());

            // PLSQL_DMLParser.g:646:9: ( LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN )?
            int alt137=2;
            int LA137_0 = input.LA(1);

            if ( (LA137_0==LEFT_PAREN) ) {
                alt137=1;
            }
            switch (alt137) {
                case 1 :
                    // PLSQL_DMLParser.g:646:10: LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN
                    {
                    LEFT_PAREN413=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_merge_insert_clause5648); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN413);


                    pushFollow(FOLLOW_column_name_in_merge_insert_clause5650);
                    column_name414=gPLSQLParser.column_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_column_name.add(column_name414.getTree());

                    // PLSQL_DMLParser.g:646:33: ( COMMA column_name )*
                    loop136:
                    do {
                        int alt136=2;
                        int LA136_0 = input.LA(1);

                        if ( (LA136_0==COMMA) ) {
                            alt136=1;
                        }


                        switch (alt136) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:646:34: COMMA column_name
                    	    {
                    	    COMMA415=(Token)match(input,COMMA,FOLLOW_COMMA_in_merge_insert_clause5653); if (state.failed) return retval; 
                    	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA415);


                    	    pushFollow(FOLLOW_column_name_in_merge_insert_clause5655);
                    	    column_name416=gPLSQLParser.column_name();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_column_name.add(column_name416.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop136;
                        }
                    } while (true);


                    RIGHT_PAREN417=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_merge_insert_clause5659); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN417);


                    }
                    break;

            }


            pushFollow(FOLLOW_values_key_in_merge_insert_clause5671);
            values_key418=gPLSQLParser.values_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_values_key.add(values_key418.getTree());

            pushFollow(FOLLOW_expression_list_in_merge_insert_clause5673);
            expression_list419=expression_list();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression_list.add(expression_list419.getTree());

            // PLSQL_DMLParser.g:647:36: ( where_clause )?
            int alt138=2;
            int LA138_0 = input.LA(1);

            if ( (LA138_0==SQL92_RESERVED_WHERE) ) {
                alt138=1;
            }
            switch (alt138) {
                case 1 :
                    // PLSQL_DMLParser.g:647:36: where_clause
                    {
                    pushFollow(FOLLOW_where_clause_in_merge_insert_clause5675);
                    where_clause420=gPLSQLParser.where_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_where_clause.add(where_clause420.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: column_name, where_clause, expression_list
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 648:9: -> ^( MERGE_INSERT ^( COLUMNS ( column_name )* ) expression_list ( where_clause )? )
            {
                // PLSQL_DMLParser.g:648:12: ^( MERGE_INSERT ^( COLUMNS ( column_name )* ) expression_list ( where_clause )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(MERGE_INSERT, "MERGE_INSERT")
                , root_1);

                // PLSQL_DMLParser.g:648:27: ^( COLUMNS ( column_name )* )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(COLUMNS, "COLUMNS")
                , root_2);

                // PLSQL_DMLParser.g:648:37: ( column_name )*
                while ( stream_column_name.hasNext() ) {
                    adaptor.addChild(root_2, stream_column_name.nextTree());

                }
                stream_column_name.reset();

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_1, stream_expression_list.nextTree());

                // PLSQL_DMLParser.g:648:67: ( where_clause )?
                if ( stream_where_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_where_clause.nextTree());

                }
                stream_where_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "merge_insert_clause"


    public static class selected_tableview_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "selected_tableview"
    // PLSQL_DMLParser.g:651:1: selected_tableview : ( tableview_name | subquery ) ( alias )? -> ^( SELECTED_TABLEVIEW ( alias )? ( tableview_name )? ( subquery )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.selected_tableview_return selected_tableview() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.selected_tableview_return retval = new PLSQLParser_PLSQL_DMLParser.selected_tableview_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLCommons.tableview_name_return tableview_name421 =null;

        PLSQLParser_PLSQL_DMLParser.subquery_return subquery422 =null;

        PLSQLParser_PLSQLCommons.alias_return alias423 =null;


        RewriteRuleSubtreeStream stream_alias=new RewriteRuleSubtreeStream(adaptor,"rule alias");
        RewriteRuleSubtreeStream stream_tableview_name=new RewriteRuleSubtreeStream(adaptor,"rule tableview_name");
        RewriteRuleSubtreeStream stream_subquery=new RewriteRuleSubtreeStream(adaptor,"rule subquery");
        try {
            // PLSQL_DMLParser.g:652:5: ( ( tableview_name | subquery ) ( alias )? -> ^( SELECTED_TABLEVIEW ( alias )? ( tableview_name )? ( subquery )? ) )
            // PLSQL_DMLParser.g:652:10: ( tableview_name | subquery ) ( alias )?
            {
            // PLSQL_DMLParser.g:652:10: ( tableview_name | subquery )
            int alt139=2;
            int LA139_0 = input.LA(1);

            if ( (LA139_0==DELIMITED_ID||LA139_0==INTRODUCER||LA139_0==REGULAR_ID) ) {
                alt139=1;
            }
            else if ( (LA139_0==LEFT_PAREN||LA139_0==SQL92_RESERVED_SELECT) ) {
                alt139=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 139, 0, input);

                throw nvae;

            }
            switch (alt139) {
                case 1 :
                    // PLSQL_DMLParser.g:652:12: tableview_name
                    {
                    pushFollow(FOLLOW_tableview_name_in_selected_tableview5725);
                    tableview_name421=gPLSQLParser.tableview_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_tableview_name.add(tableview_name421.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:652:29: subquery
                    {
                    pushFollow(FOLLOW_subquery_in_selected_tableview5729);
                    subquery422=subquery();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_subquery.add(subquery422.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:652:40: ( alias )?
            int alt140=2;
            int LA140_0 = input.LA(1);

            if ( (LA140_0==CHAR_STRING||LA140_0==DELIMITED_ID||LA140_0==INTRODUCER||LA140_0==REGULAR_ID||LA140_0==SQL92_RESERVED_AS) ) {
                alt140=1;
            }
            switch (alt140) {
                case 1 :
                    // PLSQL_DMLParser.g:652:40: alias
                    {
                    pushFollow(FOLLOW_alias_in_selected_tableview5733);
                    alias423=gPLSQLParser.alias();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_alias.add(alias423.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: subquery, tableview_name, alias
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 653:9: -> ^( SELECTED_TABLEVIEW ( alias )? ( tableview_name )? ( subquery )? )
            {
                // PLSQL_DMLParser.g:653:12: ^( SELECTED_TABLEVIEW ( alias )? ( tableview_name )? ( subquery )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(SELECTED_TABLEVIEW, "SELECTED_TABLEVIEW")
                , root_1);

                // PLSQL_DMLParser.g:653:33: ( alias )?
                if ( stream_alias.hasNext() ) {
                    adaptor.addChild(root_1, stream_alias.nextTree());

                }
                stream_alias.reset();

                // PLSQL_DMLParser.g:653:40: ( tableview_name )?
                if ( stream_tableview_name.hasNext() ) {
                    adaptor.addChild(root_1, stream_tableview_name.nextTree());

                }
                stream_tableview_name.reset();

                // PLSQL_DMLParser.g:653:56: ( subquery )?
                if ( stream_subquery.hasNext() ) {
                    adaptor.addChild(root_1, stream_subquery.nextTree());

                }
                stream_subquery.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "selected_tableview"


    public static class lock_table_statement_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "lock_table_statement"
    // PLSQL_DMLParser.g:658:1: lock_table_statement : lock_key table_key lock_table_element ( COMMA lock_table_element )* in_key lock_mode mode_key ( wait_nowait_part )? -> ^( lock_key ( lock_table_element )+ lock_mode ( wait_nowait_part )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.lock_table_statement_return lock_table_statement() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.lock_table_statement_return retval = new PLSQLParser_PLSQL_DMLParser.lock_table_statement_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COMMA427=null;
        PLSQLParser_PLSQLKeys.lock_key_return lock_key424 =null;

        PLSQLParser_PLSQLKeys.table_key_return table_key425 =null;

        PLSQLParser_PLSQL_DMLParser.lock_table_element_return lock_table_element426 =null;

        PLSQLParser_PLSQL_DMLParser.lock_table_element_return lock_table_element428 =null;

        PLSQLParser_PLSQLKeys.in_key_return in_key429 =null;

        PLSQLParser_PLSQL_DMLParser.lock_mode_return lock_mode430 =null;

        PLSQLParser_PLSQLKeys.mode_key_return mode_key431 =null;

        PLSQLParser_PLSQL_DMLParser.wait_nowait_part_return wait_nowait_part432 =null;


        Object COMMA427_tree=null;
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_lock_table_element=new RewriteRuleSubtreeStream(adaptor,"rule lock_table_element");
        RewriteRuleSubtreeStream stream_mode_key=new RewriteRuleSubtreeStream(adaptor,"rule mode_key");
        RewriteRuleSubtreeStream stream_table_key=new RewriteRuleSubtreeStream(adaptor,"rule table_key");
        RewriteRuleSubtreeStream stream_lock_mode=new RewriteRuleSubtreeStream(adaptor,"rule lock_mode");
        RewriteRuleSubtreeStream stream_wait_nowait_part=new RewriteRuleSubtreeStream(adaptor,"rule wait_nowait_part");
        RewriteRuleSubtreeStream stream_lock_key=new RewriteRuleSubtreeStream(adaptor,"rule lock_key");
        RewriteRuleSubtreeStream stream_in_key=new RewriteRuleSubtreeStream(adaptor,"rule in_key");
        try {
            // PLSQL_DMLParser.g:659:5: ( lock_key table_key lock_table_element ( COMMA lock_table_element )* in_key lock_mode mode_key ( wait_nowait_part )? -> ^( lock_key ( lock_table_element )+ lock_mode ( wait_nowait_part )? ) )
            // PLSQL_DMLParser.g:659:10: lock_key table_key lock_table_element ( COMMA lock_table_element )* in_key lock_mode mode_key ( wait_nowait_part )?
            {
            pushFollow(FOLLOW_lock_key_in_lock_table_statement5779);
            lock_key424=gPLSQLParser.lock_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_lock_key.add(lock_key424.getTree());

            pushFollow(FOLLOW_table_key_in_lock_table_statement5781);
            table_key425=gPLSQLParser.table_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_table_key.add(table_key425.getTree());

            pushFollow(FOLLOW_lock_table_element_in_lock_table_statement5792);
            lock_table_element426=lock_table_element();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_lock_table_element.add(lock_table_element426.getTree());

            // PLSQL_DMLParser.g:660:28: ( COMMA lock_table_element )*
            loop141:
            do {
                int alt141=2;
                int LA141_0 = input.LA(1);

                if ( (LA141_0==COMMA) ) {
                    alt141=1;
                }


                switch (alt141) {
            	case 1 :
            	    // PLSQL_DMLParser.g:660:29: COMMA lock_table_element
            	    {
            	    COMMA427=(Token)match(input,COMMA,FOLLOW_COMMA_in_lock_table_statement5795); if (state.failed) return retval; 
            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA427);


            	    pushFollow(FOLLOW_lock_table_element_in_lock_table_statement5797);
            	    lock_table_element428=lock_table_element();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_lock_table_element.add(lock_table_element428.getTree());

            	    }
            	    break;

            	default :
            	    break loop141;
                }
            } while (true);


            pushFollow(FOLLOW_in_key_in_lock_table_statement5810);
            in_key429=gPLSQLParser.in_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_in_key.add(in_key429.getTree());

            pushFollow(FOLLOW_lock_mode_in_lock_table_statement5812);
            lock_mode430=lock_mode();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_lock_mode.add(lock_mode430.getTree());

            pushFollow(FOLLOW_mode_key_in_lock_table_statement5814);
            mode_key431=gPLSQLParser.mode_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_mode_key.add(mode_key431.getTree());

            // PLSQL_DMLParser.g:661:35: ( wait_nowait_part )?
            int alt142=2;
            int LA142_0 = input.LA(1);

            if ( (LA142_0==REGULAR_ID) ) {
                int LA142_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("wait"))) ) {
                    alt142=1;
                }
            }
            else if ( (LA142_0==PLSQL_RESERVED_NOWAIT) ) {
                alt142=1;
            }
            switch (alt142) {
                case 1 :
                    // PLSQL_DMLParser.g:661:35: wait_nowait_part
                    {
                    pushFollow(FOLLOW_wait_nowait_part_in_lock_table_statement5816);
                    wait_nowait_part432=wait_nowait_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_wait_nowait_part.add(wait_nowait_part432.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: wait_nowait_part, lock_mode, lock_key, lock_table_element
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 662:9: -> ^( lock_key ( lock_table_element )+ lock_mode ( wait_nowait_part )? )
            {
                // PLSQL_DMLParser.g:662:12: ^( lock_key ( lock_table_element )+ lock_mode ( wait_nowait_part )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_lock_key.nextNode(), root_1);

                if ( !(stream_lock_table_element.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_lock_table_element.hasNext() ) {
                    adaptor.addChild(root_1, stream_lock_table_element.nextTree());

                }
                stream_lock_table_element.reset();

                adaptor.addChild(root_1, stream_lock_mode.nextTree());

                // PLSQL_DMLParser.g:662:53: ( wait_nowait_part )?
                if ( stream_wait_nowait_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_wait_nowait_part.nextTree());

                }
                stream_wait_nowait_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "lock_table_statement"


    public static class wait_nowait_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "wait_nowait_part"
    // PLSQL_DMLParser.g:665:1: wait_nowait_part : ( wait_key expression -> ^( wait_key ^( EXPR expression ) ) | nowait_key );
    public final PLSQLParser_PLSQL_DMLParser.wait_nowait_part_return wait_nowait_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.wait_nowait_part_return retval = new PLSQLParser_PLSQL_DMLParser.wait_nowait_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.wait_key_return wait_key433 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression434 =null;

        PLSQLParser_PLSQLKeys.nowait_key_return nowait_key435 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_wait_key=new RewriteRuleSubtreeStream(adaptor,"rule wait_key");
        try {
            // PLSQL_DMLParser.g:666:5: ( wait_key expression -> ^( wait_key ^( EXPR expression ) ) | nowait_key )
            int alt143=2;
            int LA143_0 = input.LA(1);

            if ( (LA143_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("wait")))) {
                alt143=1;
            }
            else if ( (LA143_0==PLSQL_RESERVED_NOWAIT) ) {
                alt143=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 143, 0, input);

                throw nvae;

            }
            switch (alt143) {
                case 1 :
                    // PLSQL_DMLParser.g:666:10: wait_key expression
                    {
                    pushFollow(FOLLOW_wait_key_in_wait_nowait_part5859);
                    wait_key433=gPLSQLParser.wait_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_wait_key.add(wait_key433.getTree());

                    pushFollow(FOLLOW_expression_in_wait_nowait_part5861);
                    expression434=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(expression434.getTree());

                    // AST REWRITE
                    // elements: expression, wait_key
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 666:30: -> ^( wait_key ^( EXPR expression ) )
                    {
                        // PLSQL_DMLParser.g:666:33: ^( wait_key ^( EXPR expression ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(stream_wait_key.nextNode(), root_1);

                        // PLSQL_DMLParser.g:666:44: ^( EXPR expression )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(EXPR, "EXPR")
                        , root_2);

                        adaptor.addChild(root_2, stream_expression.nextTree());

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:667:10: nowait_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_nowait_key_in_wait_nowait_part5884);
                    nowait_key435=gPLSQLParser.nowait_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, nowait_key435.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "wait_nowait_part"


    public static class lock_table_element_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "lock_table_element"
    // PLSQL_DMLParser.g:672:1: lock_table_element : tableview_name ( partition_extension_clause )? -> ^( LOCK_TABLE_ELEMENT tableview_name ( partition_extension_clause )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.lock_table_element_return lock_table_element() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.lock_table_element_return retval = new PLSQLParser_PLSQL_DMLParser.lock_table_element_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLCommons.tableview_name_return tableview_name436 =null;

        PLSQLParser_PLSQLCommons.partition_extension_clause_return partition_extension_clause437 =null;


        RewriteRuleSubtreeStream stream_partition_extension_clause=new RewriteRuleSubtreeStream(adaptor,"rule partition_extension_clause");
        RewriteRuleSubtreeStream stream_tableview_name=new RewriteRuleSubtreeStream(adaptor,"rule tableview_name");
        try {
            // PLSQL_DMLParser.g:673:5: ( tableview_name ( partition_extension_clause )? -> ^( LOCK_TABLE_ELEMENT tableview_name ( partition_extension_clause )? ) )
            // PLSQL_DMLParser.g:673:10: tableview_name ( partition_extension_clause )?
            {
            pushFollow(FOLLOW_tableview_name_in_lock_table_element5906);
            tableview_name436=gPLSQLParser.tableview_name();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_tableview_name.add(tableview_name436.getTree());

            // PLSQL_DMLParser.g:673:25: ( partition_extension_clause )?
            int alt144=2;
            int LA144_0 = input.LA(1);

            if ( (LA144_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("subpartition"))||(input.LT(1).getText().equalsIgnoreCase("partition"))))) {
                alt144=1;
            }
            switch (alt144) {
                case 1 :
                    // PLSQL_DMLParser.g:673:25: partition_extension_clause
                    {
                    pushFollow(FOLLOW_partition_extension_clause_in_lock_table_element5908);
                    partition_extension_clause437=gPLSQLParser.partition_extension_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_partition_extension_clause.add(partition_extension_clause437.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: partition_extension_clause, tableview_name
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 674:9: -> ^( LOCK_TABLE_ELEMENT tableview_name ( partition_extension_clause )? )
            {
                // PLSQL_DMLParser.g:674:12: ^( LOCK_TABLE_ELEMENT tableview_name ( partition_extension_clause )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(LOCK_TABLE_ELEMENT, "LOCK_TABLE_ELEMENT")
                , root_1);

                adaptor.addChild(root_1, stream_tableview_name.nextTree());

                // PLSQL_DMLParser.g:674:48: ( partition_extension_clause )?
                if ( stream_partition_extension_clause.hasNext() ) {
                    adaptor.addChild(root_1, stream_partition_extension_clause.nextTree());

                }
                stream_partition_extension_clause.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "lock_table_element"


    public static class lock_mode_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "lock_mode"
    // PLSQL_DMLParser.g:677:1: lock_mode : ( row_key share_key | row_key exclusive_key | share_key ( update_key )? | share_key row_key exclusive_key | exclusive_key );
    public final PLSQLParser_PLSQL_DMLParser.lock_mode_return lock_mode() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.lock_mode_return retval = new PLSQLParser_PLSQL_DMLParser.lock_mode_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.row_key_return row_key438 =null;

        PLSQLParser_PLSQLKeys.share_key_return share_key439 =null;

        PLSQLParser_PLSQLKeys.row_key_return row_key440 =null;

        PLSQLParser_PLSQLKeys.exclusive_key_return exclusive_key441 =null;

        PLSQLParser_PLSQLKeys.share_key_return share_key442 =null;

        PLSQLParser_PLSQLKeys.update_key_return update_key443 =null;

        PLSQLParser_PLSQLKeys.share_key_return share_key444 =null;

        PLSQLParser_PLSQLKeys.row_key_return row_key445 =null;

        PLSQLParser_PLSQLKeys.exclusive_key_return exclusive_key446 =null;

        PLSQLParser_PLSQLKeys.exclusive_key_return exclusive_key447 =null;



        try {
            // PLSQL_DMLParser.g:678:5: ( row_key share_key | row_key exclusive_key | share_key ( update_key )? | share_key row_key exclusive_key | exclusive_key )
            int alt146=5;
            switch ( input.LA(1) ) {
            case REGULAR_ID:
                {
                int LA146_1 = input.LA(2);

                if ( (LA146_1==PLSQL_RESERVED_SHARE) ) {
                    alt146=1;
                }
                else if ( (LA146_1==PLSQL_RESERVED_EXCLUSIVE) ) {
                    alt146=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 146, 1, input);

                    throw nvae;

                }
                }
                break;
            case PLSQL_RESERVED_SHARE:
                {
                int LA146_2 = input.LA(2);

                if ( (LA146_2==PLSQL_RESERVED_MODE||LA146_2==SQL92_RESERVED_UPDATE) ) {
                    alt146=3;
                }
                else if ( (LA146_2==REGULAR_ID) ) {
                    alt146=4;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 146, 2, input);

                    throw nvae;

                }
                }
                break;
            case PLSQL_RESERVED_EXCLUSIVE:
                {
                alt146=5;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 146, 0, input);

                throw nvae;

            }

            switch (alt146) {
                case 1 :
                    // PLSQL_DMLParser.g:678:10: row_key share_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_row_key_in_lock_mode5948);
                    row_key438=gPLSQLParser.row_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, row_key438.getTree());

                    pushFollow(FOLLOW_share_key_in_lock_mode5950);
                    share_key439=gPLSQLParser.share_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, share_key439.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:679:10: row_key exclusive_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_row_key_in_lock_mode5961);
                    row_key440=gPLSQLParser.row_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, row_key440.getTree());

                    pushFollow(FOLLOW_exclusive_key_in_lock_mode5963);
                    exclusive_key441=gPLSQLParser.exclusive_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, exclusive_key441.getTree());

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:680:10: share_key ( update_key )?
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_share_key_in_lock_mode5974);
                    share_key442=gPLSQLParser.share_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, share_key442.getTree());

                    // PLSQL_DMLParser.g:680:20: ( update_key )?
                    int alt145=2;
                    int LA145_0 = input.LA(1);

                    if ( (LA145_0==SQL92_RESERVED_UPDATE) ) {
                        alt145=1;
                    }
                    switch (alt145) {
                        case 1 :
                            // PLSQL_DMLParser.g:680:20: update_key
                            {
                            pushFollow(FOLLOW_update_key_in_lock_mode5976);
                            update_key443=gPLSQLParser.update_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, update_key443.getTree());

                            }
                            break;

                    }


                    }
                    break;
                case 4 :
                    // PLSQL_DMLParser.g:681:10: share_key row_key exclusive_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_share_key_in_lock_mode5988);
                    share_key444=gPLSQLParser.share_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, share_key444.getTree());

                    pushFollow(FOLLOW_row_key_in_lock_mode5990);
                    row_key445=gPLSQLParser.row_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, row_key445.getTree());

                    pushFollow(FOLLOW_exclusive_key_in_lock_mode5992);
                    exclusive_key446=gPLSQLParser.exclusive_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, exclusive_key446.getTree());

                    }
                    break;
                case 5 :
                    // PLSQL_DMLParser.g:682:10: exclusive_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_exclusive_key_in_lock_mode6003);
                    exclusive_key447=gPLSQLParser.exclusive_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, exclusive_key447.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "lock_mode"


    public static class general_table_ref_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "general_table_ref"
    // PLSQL_DMLParser.g:688:1: general_table_ref : ( dml_table_expression_clause | only_key LEFT_PAREN dml_table_expression_clause RIGHT_PAREN ) ( alias )? -> ^( TABLE_REF ( alias )? dml_table_expression_clause ( only_key )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.general_table_ref_return general_table_ref() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.general_table_ref_return retval = new PLSQLParser_PLSQL_DMLParser.general_table_ref_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN450=null;
        Token RIGHT_PAREN452=null;
        PLSQLParser_PLSQL_DMLParser.dml_table_expression_clause_return dml_table_expression_clause448 =null;

        PLSQLParser_PLSQLKeys.only_key_return only_key449 =null;

        PLSQLParser_PLSQL_DMLParser.dml_table_expression_clause_return dml_table_expression_clause451 =null;

        PLSQLParser_PLSQLCommons.alias_return alias453 =null;


        Object LEFT_PAREN450_tree=null;
        Object RIGHT_PAREN452_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleSubtreeStream stream_dml_table_expression_clause=new RewriteRuleSubtreeStream(adaptor,"rule dml_table_expression_clause");
        RewriteRuleSubtreeStream stream_alias=new RewriteRuleSubtreeStream(adaptor,"rule alias");
        RewriteRuleSubtreeStream stream_only_key=new RewriteRuleSubtreeStream(adaptor,"rule only_key");
        try {
            // PLSQL_DMLParser.g:689:5: ( ( dml_table_expression_clause | only_key LEFT_PAREN dml_table_expression_clause RIGHT_PAREN ) ( alias )? -> ^( TABLE_REF ( alias )? dml_table_expression_clause ( only_key )? ) )
            // PLSQL_DMLParser.g:689:10: ( dml_table_expression_clause | only_key LEFT_PAREN dml_table_expression_clause RIGHT_PAREN ) ( alias )?
            {
            // PLSQL_DMLParser.g:689:10: ( dml_table_expression_clause | only_key LEFT_PAREN dml_table_expression_clause RIGHT_PAREN )
            int alt147=2;
            int LA147_0 = input.LA(1);

            if ( (LA147_0==DELIMITED_ID||LA147_0==INTRODUCER||LA147_0==LEFT_PAREN||LA147_0==SQL92_RESERVED_TABLE) ) {
                alt147=1;
            }
            else if ( (LA147_0==REGULAR_ID) ) {
                int LA147_4 = input.LA(2);

                if ( (!(((input.LT(1).getText().equalsIgnoreCase("only"))))) ) {
                    alt147=1;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("only"))) ) {
                    alt147=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 147, 4, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 147, 0, input);

                throw nvae;

            }
            switch (alt147) {
                case 1 :
                    // PLSQL_DMLParser.g:689:15: dml_table_expression_clause
                    {
                    pushFollow(FOLLOW_dml_table_expression_clause_in_general_table_ref6031);
                    dml_table_expression_clause448=dml_table_expression_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_dml_table_expression_clause.add(dml_table_expression_clause448.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:690:14: only_key LEFT_PAREN dml_table_expression_clause RIGHT_PAREN
                    {
                    pushFollow(FOLLOW_only_key_in_general_table_ref6046);
                    only_key449=gPLSQLParser.only_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_only_key.add(only_key449.getTree());

                    LEFT_PAREN450=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_general_table_ref6048); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN450);


                    pushFollow(FOLLOW_dml_table_expression_clause_in_general_table_ref6050);
                    dml_table_expression_clause451=dml_table_expression_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_dml_table_expression_clause.add(dml_table_expression_clause451.getTree());

                    RIGHT_PAREN452=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_general_table_ref6052); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN452);


                    }
                    break;

            }


            // PLSQL_DMLParser.g:691:14: ( alias )?
            int alt148=2;
            switch ( input.LA(1) ) {
                case INTRODUCER:
                case SQL92_RESERVED_AS:
                    {
                    alt148=1;
                    }
                    break;
                case REGULAR_ID:
                    {
                    alt148=1;
                    }
                    break;
                case CHAR_STRING:
                case DELIMITED_ID:
                    {
                    alt148=1;
                    }
                    break;
            }

            switch (alt148) {
                case 1 :
                    // PLSQL_DMLParser.g:691:14: alias
                    {
                    pushFollow(FOLLOW_alias_in_general_table_ref6067);
                    alias453=gPLSQLParser.alias();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_alias.add(alias453.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: only_key, dml_table_expression_clause, alias
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 692:9: -> ^( TABLE_REF ( alias )? dml_table_expression_clause ( only_key )? )
            {
                // PLSQL_DMLParser.g:692:12: ^( TABLE_REF ( alias )? dml_table_expression_clause ( only_key )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(TABLE_REF, "TABLE_REF")
                , root_1);

                // PLSQL_DMLParser.g:692:24: ( alias )?
                if ( stream_alias.hasNext() ) {
                    adaptor.addChild(root_1, stream_alias.nextTree());

                }
                stream_alias.reset();

                adaptor.addChild(root_1, stream_dml_table_expression_clause.nextTree());

                // PLSQL_DMLParser.g:692:59: ( only_key )?
                if ( stream_only_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_only_key.nextTree());

                }
                stream_only_key.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "general_table_ref"


    public static class static_returning_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "static_returning_clause"
    // PLSQL_DMLParser.g:695:1: static_returning_clause : ( returning_key | return_key ) expression ( COMMA expression )* into_clause -> ^( STATIC_RETURNING ( ^( EXPR expression ) )+ into_clause ) ;
    public final PLSQLParser_PLSQL_DMLParser.static_returning_clause_return static_returning_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.static_returning_clause_return retval = new PLSQLParser_PLSQL_DMLParser.static_returning_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COMMA457=null;
        PLSQLParser_PLSQLKeys.returning_key_return returning_key454 =null;

        PLSQLParser_PLSQLKeys.return_key_return return_key455 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression456 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression458 =null;

        PLSQLParser_PLSQLCommons.into_clause_return into_clause459 =null;


        Object COMMA457_tree=null;
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_returning_key=new RewriteRuleSubtreeStream(adaptor,"rule returning_key");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_return_key=new RewriteRuleSubtreeStream(adaptor,"rule return_key");
        RewriteRuleSubtreeStream stream_into_clause=new RewriteRuleSubtreeStream(adaptor,"rule into_clause");
        try {
            // PLSQL_DMLParser.g:696:5: ( ( returning_key | return_key ) expression ( COMMA expression )* into_clause -> ^( STATIC_RETURNING ( ^( EXPR expression ) )+ into_clause ) )
            // PLSQL_DMLParser.g:696:10: ( returning_key | return_key ) expression ( COMMA expression )* into_clause
            {
            // PLSQL_DMLParser.g:696:10: ( returning_key | return_key )
            int alt149=2;
            int LA149_0 = input.LA(1);

            if ( (LA149_0==REGULAR_ID) ) {
                int LA149_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("returning"))) ) {
                    alt149=1;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("return"))) ) {
                    alt149=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 149, 1, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 149, 0, input);

                throw nvae;

            }
            switch (alt149) {
                case 1 :
                    // PLSQL_DMLParser.g:696:11: returning_key
                    {
                    pushFollow(FOLLOW_returning_key_in_static_returning_clause6111);
                    returning_key454=gPLSQLParser.returning_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_returning_key.add(returning_key454.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:696:25: return_key
                    {
                    pushFollow(FOLLOW_return_key_in_static_returning_clause6113);
                    return_key455=gPLSQLParser.return_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_return_key.add(return_key455.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_expression_in_static_returning_clause6116);
            expression456=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression456.getTree());

            // PLSQL_DMLParser.g:696:48: ( COMMA expression )*
            loop150:
            do {
                int alt150=2;
                int LA150_0 = input.LA(1);

                if ( (LA150_0==COMMA) ) {
                    alt150=1;
                }


                switch (alt150) {
            	case 1 :
            	    // PLSQL_DMLParser.g:696:49: COMMA expression
            	    {
            	    COMMA457=(Token)match(input,COMMA,FOLLOW_COMMA_in_static_returning_clause6119); if (state.failed) return retval; 
            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA457);


            	    pushFollow(FOLLOW_expression_in_static_returning_clause6121);
            	    expression458=expression();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_expression.add(expression458.getTree());

            	    }
            	    break;

            	default :
            	    break loop150;
                }
            } while (true);


            pushFollow(FOLLOW_into_clause_in_static_returning_clause6134);
            into_clause459=gPLSQLParser.into_clause();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_into_clause.add(into_clause459.getTree());

            // AST REWRITE
            // elements: into_clause, expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 698:9: -> ^( STATIC_RETURNING ( ^( EXPR expression ) )+ into_clause )
            {
                // PLSQL_DMLParser.g:698:12: ^( STATIC_RETURNING ( ^( EXPR expression ) )+ into_clause )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(STATIC_RETURNING, "STATIC_RETURNING")
                , root_1);

                if ( !(stream_expression.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_expression.hasNext() ) {
                    // PLSQL_DMLParser.g:698:31: ^( EXPR expression )
                    {
                    Object root_2 = (Object)adaptor.nil();
                    root_2 = (Object)adaptor.becomeRoot(
                    (Object)adaptor.create(EXPR, "EXPR")
                    , root_2);

                    adaptor.addChild(root_2, stream_expression.nextTree());

                    adaptor.addChild(root_1, root_2);
                    }

                }
                stream_expression.reset();

                adaptor.addChild(root_1, stream_into_clause.nextTree());

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "static_returning_clause"


    public static class error_logging_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "error_logging_clause"
    // PLSQL_DMLParser.g:701:1: error_logging_clause : log_key errors_key ( error_logging_into_part )? ( ( LEFT_PAREN )=> expression_wrapper )? ( error_logging_reject_part )? -> ^( log_key ( error_logging_into_part )? ( expression_wrapper )? ( error_logging_reject_part )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.error_logging_clause_return error_logging_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.error_logging_clause_return retval = new PLSQLParser_PLSQL_DMLParser.error_logging_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.log_key_return log_key460 =null;

        PLSQLParser_PLSQLKeys.errors_key_return errors_key461 =null;

        PLSQLParser_PLSQL_DMLParser.error_logging_into_part_return error_logging_into_part462 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper463 =null;

        PLSQLParser_PLSQL_DMLParser.error_logging_reject_part_return error_logging_reject_part464 =null;


        RewriteRuleSubtreeStream stream_error_logging_reject_part=new RewriteRuleSubtreeStream(adaptor,"rule error_logging_reject_part");
        RewriteRuleSubtreeStream stream_expression_wrapper=new RewriteRuleSubtreeStream(adaptor,"rule expression_wrapper");
        RewriteRuleSubtreeStream stream_errors_key=new RewriteRuleSubtreeStream(adaptor,"rule errors_key");
        RewriteRuleSubtreeStream stream_error_logging_into_part=new RewriteRuleSubtreeStream(adaptor,"rule error_logging_into_part");
        RewriteRuleSubtreeStream stream_log_key=new RewriteRuleSubtreeStream(adaptor,"rule log_key");
        try {
            // PLSQL_DMLParser.g:702:5: ( log_key errors_key ( error_logging_into_part )? ( ( LEFT_PAREN )=> expression_wrapper )? ( error_logging_reject_part )? -> ^( log_key ( error_logging_into_part )? ( expression_wrapper )? ( error_logging_reject_part )? ) )
            // PLSQL_DMLParser.g:702:10: log_key errors_key ( error_logging_into_part )? ( ( LEFT_PAREN )=> expression_wrapper )? ( error_logging_reject_part )?
            {
            pushFollow(FOLLOW_log_key_in_error_logging_clause6177);
            log_key460=gPLSQLParser.log_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_log_key.add(log_key460.getTree());

            pushFollow(FOLLOW_errors_key_in_error_logging_clause6179);
            errors_key461=gPLSQLParser.errors_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_errors_key.add(errors_key461.getTree());

            // PLSQL_DMLParser.g:703:9: ( error_logging_into_part )?
            int alt151=2;
            alt151 = dfa151.predict(input);
            switch (alt151) {
                case 1 :
                    // PLSQL_DMLParser.g:703:9: error_logging_into_part
                    {
                    pushFollow(FOLLOW_error_logging_into_part_in_error_logging_clause6190);
                    error_logging_into_part462=error_logging_into_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_error_logging_into_part.add(error_logging_into_part462.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:704:9: ( ( LEFT_PAREN )=> expression_wrapper )?
            int alt152=2;
            int LA152_0 = input.LA(1);

            if ( (LA152_0==SQL92_RESERVED_NOT) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==MINUS_SIGN) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==PLUS_SIGN) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==SQL92_RESERVED_PRIOR) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==REGULAR_ID) ) {
                int LA152_5 = input.LA(2);

                if ( (synpred13_PLSQL_DMLParser()) ) {
                    alt152=1;
                }
            }
            else if ( (LA152_0==SQL92_RESERVED_DISTINCT) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==SQL92_RESERVED_ALL) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==DELIMITED_ID) ) {
                int LA152_8 = input.LA(2);

                if ( (synpred13_PLSQL_DMLParser()) ) {
                    alt152=1;
                }
            }
            else if ( (LA152_0==SQL92_RESERVED_CASE) ) {
                int LA152_9 = input.LA(2);

                if ( (((synpred13_PLSQL_DMLParser()&&synpred13_PLSQL_DMLParser())&&((input.LA(1) == SQL92_RESERVED_CASE || input.LA(2) == SQL92_RESERVED_CASE)))) ) {
                    alt152=1;
                }
            }
            else if ( (LA152_0==SQL92_RESERVED_EXISTS) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==SQL92_RESERVED_ANY) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==APPROXIMATE_NUM_LIT||LA152_0==EXACT_NUM_LIT||LA152_0==UNSIGNED_INTEGER) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==CHAR_STRING) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==SQL92_RESERVED_NULL) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==SQL92_RESERVED_TRUE) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==SQL92_RESERVED_FALSE) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==SQL92_RESERVED_DEFAULT) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==INTRODUCER) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==COLON) && (synpred13_PLSQL_DMLParser())) {
                alt152=1;
            }
            else if ( (LA152_0==LEFT_PAREN) ) {
                int LA152_20 = input.LA(2);

                if ( (synpred13_PLSQL_DMLParser()) ) {
                    alt152=1;
                }
            }
            switch (alt152) {
                case 1 :
                    // PLSQL_DMLParser.g:704:10: ( LEFT_PAREN )=> expression_wrapper
                    {
                    pushFollow(FOLLOW_expression_wrapper_in_error_logging_clause6207);
                    expression_wrapper463=expression_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression_wrapper.add(expression_wrapper463.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:705:9: ( error_logging_reject_part )?
            int alt153=2;
            int LA153_0 = input.LA(1);

            if ( (LA153_0==REGULAR_ID) ) {
                int LA153_1 = input.LA(2);

                if ( (LA153_1==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("reject")))) {
                    alt153=1;
                }
            }
            switch (alt153) {
                case 1 :
                    // PLSQL_DMLParser.g:705:9: error_logging_reject_part
                    {
                    pushFollow(FOLLOW_error_logging_reject_part_in_error_logging_clause6219);
                    error_logging_reject_part464=error_logging_reject_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_error_logging_reject_part.add(error_logging_reject_part464.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: error_logging_reject_part, expression_wrapper, log_key, error_logging_into_part
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 706:9: -> ^( log_key ( error_logging_into_part )? ( expression_wrapper )? ( error_logging_reject_part )? )
            {
                // PLSQL_DMLParser.g:706:12: ^( log_key ( error_logging_into_part )? ( expression_wrapper )? ( error_logging_reject_part )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_log_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:706:22: ( error_logging_into_part )?
                if ( stream_error_logging_into_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_error_logging_into_part.nextTree());

                }
                stream_error_logging_into_part.reset();

                // PLSQL_DMLParser.g:706:47: ( expression_wrapper )?
                if ( stream_expression_wrapper.hasNext() ) {
                    adaptor.addChild(root_1, stream_expression_wrapper.nextTree());

                }
                stream_expression_wrapper.reset();

                // PLSQL_DMLParser.g:706:67: ( error_logging_reject_part )?
                if ( stream_error_logging_reject_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_error_logging_reject_part.nextTree());

                }
                stream_error_logging_reject_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "error_logging_clause"


    public static class error_logging_into_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "error_logging_into_part"
    // PLSQL_DMLParser.g:709:1: error_logging_into_part : into_key ^ tableview_name ;
    public final PLSQLParser_PLSQL_DMLParser.error_logging_into_part_return error_logging_into_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.error_logging_into_part_return retval = new PLSQLParser_PLSQL_DMLParser.error_logging_into_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.into_key_return into_key465 =null;

        PLSQLParser_PLSQLCommons.tableview_name_return tableview_name466 =null;



        try {
            // PLSQL_DMLParser.g:710:5: ( into_key ^ tableview_name )
            // PLSQL_DMLParser.g:710:10: into_key ^ tableview_name
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_into_key_in_error_logging_into_part6263);
            into_key465=gPLSQLParser.into_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(into_key465.getTree(), root_0);

            pushFollow(FOLLOW_tableview_name_in_error_logging_into_part6266);
            tableview_name466=gPLSQLParser.tableview_name();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, tableview_name466.getTree());

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "error_logging_into_part"


    public static class error_logging_reject_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "error_logging_reject_part"
    // PLSQL_DMLParser.g:713:1: error_logging_reject_part : reject_key ^ limit_key ! ( ( unlimited_key )=> unlimited_key | expression_wrapper ) ;
    public final PLSQLParser_PLSQL_DMLParser.error_logging_reject_part_return error_logging_reject_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.error_logging_reject_part_return retval = new PLSQLParser_PLSQL_DMLParser.error_logging_reject_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.reject_key_return reject_key467 =null;

        PLSQLParser_PLSQLKeys.limit_key_return limit_key468 =null;

        PLSQLParser_PLSQLKeys.unlimited_key_return unlimited_key469 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper470 =null;



        try {
            // PLSQL_DMLParser.g:714:5: ( reject_key ^ limit_key ! ( ( unlimited_key )=> unlimited_key | expression_wrapper ) )
            // PLSQL_DMLParser.g:714:10: reject_key ^ limit_key ! ( ( unlimited_key )=> unlimited_key | expression_wrapper )
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_reject_key_in_error_logging_reject_part6286);
            reject_key467=gPLSQLParser.reject_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(reject_key467.getTree(), root_0);

            pushFollow(FOLLOW_limit_key_in_error_logging_reject_part6289);
            limit_key468=gPLSQLParser.limit_key();

            state._fsp--;
            if (state.failed) return retval;

            // PLSQL_DMLParser.g:714:33: ( ( unlimited_key )=> unlimited_key | expression_wrapper )
            int alt154=2;
            int LA154_0 = input.LA(1);

            if ( (LA154_0==REGULAR_ID) ) {
                int LA154_1 = input.LA(2);

                if ( ((((input.LT(1).getText().equalsIgnoreCase("unlimited"))&&(input.LT(1).getText().equalsIgnoreCase("unlimited")))&&synpred14_PLSQL_DMLParser())) ) {
                    alt154=1;
                }
                else if ( (true) ) {
                    alt154=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 154, 1, input);

                    throw nvae;

                }
            }
            else if ( (LA154_0==APPROXIMATE_NUM_LIT||(LA154_0 >= CHAR_STRING && LA154_0 <= COLON)||LA154_0==DELIMITED_ID||LA154_0==EXACT_NUM_LIT||LA154_0==INTRODUCER||LA154_0==LEFT_PAREN||LA154_0==MINUS_SIGN||LA154_0==PLUS_SIGN||LA154_0==SQL92_RESERVED_ALL||LA154_0==SQL92_RESERVED_ANY||LA154_0==SQL92_RESERVED_CASE||LA154_0==SQL92_RESERVED_DEFAULT||LA154_0==SQL92_RESERVED_DISTINCT||(LA154_0 >= SQL92_RESERVED_EXISTS && LA154_0 <= SQL92_RESERVED_FALSE)||(LA154_0 >= SQL92_RESERVED_NOT && LA154_0 <= SQL92_RESERVED_NULL)||LA154_0==SQL92_RESERVED_PRIOR||LA154_0==SQL92_RESERVED_TRUE||LA154_0==UNSIGNED_INTEGER) ) {
                alt154=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 154, 0, input);

                throw nvae;

            }
            switch (alt154) {
                case 1 :
                    // PLSQL_DMLParser.g:714:34: ( unlimited_key )=> unlimited_key
                    {
                    pushFollow(FOLLOW_unlimited_key_in_error_logging_reject_part6297);
                    unlimited_key469=gPLSQLParser.unlimited_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, unlimited_key469.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:714:65: expression_wrapper
                    {
                    pushFollow(FOLLOW_expression_wrapper_in_error_logging_reject_part6299);
                    expression_wrapper470=expression_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper470.getTree());

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "error_logging_reject_part"


    public static class dml_table_expression_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "dml_table_expression_clause"
    // PLSQL_DMLParser.g:717:1: dml_table_expression_clause : ( table_collection_expression -> ^( TABLE_EXPRESSION ^( COLLECTION_MODE table_collection_expression ) ) | LEFT_PAREN select_statement ( subquery_restriction_clause )? RIGHT_PAREN -> ^( TABLE_EXPRESSION ^( SELECT_MODE select_statement ( subquery_restriction_clause )? ) ) | tableview_name ( sample_clause )? -> ^( TABLE_EXPRESSION ^( DIRECT_MODE tableview_name ( sample_clause )? ) ) );
    public final PLSQLParser_PLSQL_DMLParser.dml_table_expression_clause_return dml_table_expression_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.dml_table_expression_clause_return retval = new PLSQLParser_PLSQL_DMLParser.dml_table_expression_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN472=null;
        Token RIGHT_PAREN475=null;
        PLSQLParser_PLSQL_DMLParser.table_collection_expression_return table_collection_expression471 =null;

        PLSQLParser_PLSQL_DMLParser.select_statement_return select_statement473 =null;

        PLSQLParser_PLSQL_DMLParser.subquery_restriction_clause_return subquery_restriction_clause474 =null;

        PLSQLParser_PLSQLCommons.tableview_name_return tableview_name476 =null;

        PLSQLParser_PLSQL_DMLParser.sample_clause_return sample_clause477 =null;


        Object LEFT_PAREN472_tree=null;
        Object RIGHT_PAREN475_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleSubtreeStream stream_sample_clause=new RewriteRuleSubtreeStream(adaptor,"rule sample_clause");
        RewriteRuleSubtreeStream stream_select_statement=new RewriteRuleSubtreeStream(adaptor,"rule select_statement");
        RewriteRuleSubtreeStream stream_table_collection_expression=new RewriteRuleSubtreeStream(adaptor,"rule table_collection_expression");
        RewriteRuleSubtreeStream stream_tableview_name=new RewriteRuleSubtreeStream(adaptor,"rule tableview_name");
        RewriteRuleSubtreeStream stream_subquery_restriction_clause=new RewriteRuleSubtreeStream(adaptor,"rule subquery_restriction_clause");
        try {
            // PLSQL_DMLParser.g:718:5: ( table_collection_expression -> ^( TABLE_EXPRESSION ^( COLLECTION_MODE table_collection_expression ) ) | LEFT_PAREN select_statement ( subquery_restriction_clause )? RIGHT_PAREN -> ^( TABLE_EXPRESSION ^( SELECT_MODE select_statement ( subquery_restriction_clause )? ) ) | tableview_name ( sample_clause )? -> ^( TABLE_EXPRESSION ^( DIRECT_MODE tableview_name ( sample_clause )? ) ) )
            int alt157=3;
            switch ( input.LA(1) ) {
            case SQL92_RESERVED_TABLE:
                {
                alt157=1;
                }
                break;
            case LEFT_PAREN:
                {
                alt157=2;
                }
                break;
            case DELIMITED_ID:
            case INTRODUCER:
            case REGULAR_ID:
                {
                alt157=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 157, 0, input);

                throw nvae;

            }

            switch (alt157) {
                case 1 :
                    // PLSQL_DMLParser.g:718:10: table_collection_expression
                    {
                    pushFollow(FOLLOW_table_collection_expression_in_dml_table_expression_clause6320);
                    table_collection_expression471=table_collection_expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_table_collection_expression.add(table_collection_expression471.getTree());

                    // AST REWRITE
                    // elements: table_collection_expression
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 718:38: -> ^( TABLE_EXPRESSION ^( COLLECTION_MODE table_collection_expression ) )
                    {
                        // PLSQL_DMLParser.g:718:41: ^( TABLE_EXPRESSION ^( COLLECTION_MODE table_collection_expression ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(TABLE_EXPRESSION, "TABLE_EXPRESSION")
                        , root_1);

                        // PLSQL_DMLParser.g:718:60: ^( COLLECTION_MODE table_collection_expression )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(COLLECTION_MODE, "COLLECTION_MODE")
                        , root_2);

                        adaptor.addChild(root_2, stream_table_collection_expression.nextTree());

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:719:10: LEFT_PAREN select_statement ( subquery_restriction_clause )? RIGHT_PAREN
                    {
                    LEFT_PAREN472=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_dml_table_expression_clause6343); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN472);


                    pushFollow(FOLLOW_select_statement_in_dml_table_expression_clause6345);
                    select_statement473=select_statement();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_select_statement.add(select_statement473.getTree());

                    // PLSQL_DMLParser.g:719:38: ( subquery_restriction_clause )?
                    int alt155=2;
                    int LA155_0 = input.LA(1);

                    if ( (LA155_0==SQL92_RESERVED_WITH) ) {
                        alt155=1;
                    }
                    switch (alt155) {
                        case 1 :
                            // PLSQL_DMLParser.g:719:38: subquery_restriction_clause
                            {
                            pushFollow(FOLLOW_subquery_restriction_clause_in_dml_table_expression_clause6347);
                            subquery_restriction_clause474=subquery_restriction_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_subquery_restriction_clause.add(subquery_restriction_clause474.getTree());

                            }
                            break;

                    }


                    RIGHT_PAREN475=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_dml_table_expression_clause6350); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN475);


                    // AST REWRITE
                    // elements: select_statement, subquery_restriction_clause
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 719:79: -> ^( TABLE_EXPRESSION ^( SELECT_MODE select_statement ( subquery_restriction_clause )? ) )
                    {
                        // PLSQL_DMLParser.g:719:82: ^( TABLE_EXPRESSION ^( SELECT_MODE select_statement ( subquery_restriction_clause )? ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(TABLE_EXPRESSION, "TABLE_EXPRESSION")
                        , root_1);

                        // PLSQL_DMLParser.g:719:101: ^( SELECT_MODE select_statement ( subquery_restriction_clause )? )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(SELECT_MODE, "SELECT_MODE")
                        , root_2);

                        adaptor.addChild(root_2, stream_select_statement.nextTree());

                        // PLSQL_DMLParser.g:719:132: ( subquery_restriction_clause )?
                        if ( stream_subquery_restriction_clause.hasNext() ) {
                            adaptor.addChild(root_2, stream_subquery_restriction_clause.nextTree());

                        }
                        stream_subquery_restriction_clause.reset();

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:720:10: tableview_name ( sample_clause )?
                    {
                    pushFollow(FOLLOW_tableview_name_in_dml_table_expression_clause6376);
                    tableview_name476=gPLSQLParser.tableview_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_tableview_name.add(tableview_name476.getTree());

                    // PLSQL_DMLParser.g:720:25: ( sample_clause )?
                    int alt156=2;
                    int LA156_0 = input.LA(1);

                    if ( (LA156_0==REGULAR_ID) ) {
                        int LA156_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("sample"))) ) {
                            alt156=1;
                        }
                    }
                    switch (alt156) {
                        case 1 :
                            // PLSQL_DMLParser.g:720:25: sample_clause
                            {
                            pushFollow(FOLLOW_sample_clause_in_dml_table_expression_clause6378);
                            sample_clause477=sample_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_sample_clause.add(sample_clause477.getTree());

                            }
                            break;

                    }


                    // AST REWRITE
                    // elements: sample_clause, tableview_name
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 720:40: -> ^( TABLE_EXPRESSION ^( DIRECT_MODE tableview_name ( sample_clause )? ) )
                    {
                        // PLSQL_DMLParser.g:720:43: ^( TABLE_EXPRESSION ^( DIRECT_MODE tableview_name ( sample_clause )? ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(TABLE_EXPRESSION, "TABLE_EXPRESSION")
                        , root_1);

                        // PLSQL_DMLParser.g:720:62: ^( DIRECT_MODE tableview_name ( sample_clause )? )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(DIRECT_MODE, "DIRECT_MODE")
                        , root_2);

                        adaptor.addChild(root_2, stream_tableview_name.nextTree());

                        // PLSQL_DMLParser.g:720:91: ( sample_clause )?
                        if ( stream_sample_clause.hasNext() ) {
                            adaptor.addChild(root_2, stream_sample_clause.nextTree());

                        }
                        stream_sample_clause.reset();

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "dml_table_expression_clause"


    public static class table_collection_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "table_collection_expression"
    // PLSQL_DMLParser.g:723:1: table_collection_expression : table_key LEFT_PAREN expression RIGHT_PAREN ( LEFT_PAREN PLUS_SIGN RIGHT_PAREN )? -> ^( EXPR expression ) ( PLUS_SIGN )? ;
    public final PLSQLParser_PLSQL_DMLParser.table_collection_expression_return table_collection_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.table_collection_expression_return retval = new PLSQLParser_PLSQL_DMLParser.table_collection_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN479=null;
        Token RIGHT_PAREN481=null;
        Token LEFT_PAREN482=null;
        Token PLUS_SIGN483=null;
        Token RIGHT_PAREN484=null;
        PLSQLParser_PLSQLKeys.table_key_return table_key478 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression480 =null;


        Object LEFT_PAREN479_tree=null;
        Object RIGHT_PAREN481_tree=null;
        Object LEFT_PAREN482_tree=null;
        Object PLUS_SIGN483_tree=null;
        Object RIGHT_PAREN484_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_PLUS_SIGN=new RewriteRuleTokenStream(adaptor,"token PLUS_SIGN");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_table_key=new RewriteRuleSubtreeStream(adaptor,"rule table_key");
        try {
            // PLSQL_DMLParser.g:724:5: ( table_key LEFT_PAREN expression RIGHT_PAREN ( LEFT_PAREN PLUS_SIGN RIGHT_PAREN )? -> ^( EXPR expression ) ( PLUS_SIGN )? )
            // PLSQL_DMLParser.g:724:10: table_key LEFT_PAREN expression RIGHT_PAREN ( LEFT_PAREN PLUS_SIGN RIGHT_PAREN )?
            {
            pushFollow(FOLLOW_table_key_in_table_collection_expression6414);
            table_key478=gPLSQLParser.table_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_table_key.add(table_key478.getTree());

            LEFT_PAREN479=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_table_collection_expression6424); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN479);


            pushFollow(FOLLOW_expression_in_table_collection_expression6426);
            expression480=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression480.getTree());

            RIGHT_PAREN481=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_table_collection_expression6428); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN481);


            // PLSQL_DMLParser.g:726:9: ( LEFT_PAREN PLUS_SIGN RIGHT_PAREN )?
            int alt158=2;
            int LA158_0 = input.LA(1);

            if ( (LA158_0==LEFT_PAREN) ) {
                int LA158_1 = input.LA(2);

                if ( (LA158_1==PLUS_SIGN) ) {
                    alt158=1;
                }
            }
            switch (alt158) {
                case 1 :
                    // PLSQL_DMLParser.g:726:10: LEFT_PAREN PLUS_SIGN RIGHT_PAREN
                    {
                    LEFT_PAREN482=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_table_collection_expression6441); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN482);


                    PLUS_SIGN483=(Token)match(input,PLUS_SIGN,FOLLOW_PLUS_SIGN_in_table_collection_expression6443); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_PLUS_SIGN.add(PLUS_SIGN483);


                    RIGHT_PAREN484=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_table_collection_expression6445); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN484);


                    }
                    break;

            }


            // AST REWRITE
            // elements: expression, PLUS_SIGN
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 727:9: -> ^( EXPR expression ) ( PLUS_SIGN )?
            {
                // PLSQL_DMLParser.g:727:12: ^( EXPR expression )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_1);

                adaptor.addChild(root_1, stream_expression.nextTree());

                adaptor.addChild(root_0, root_1);
                }

                // PLSQL_DMLParser.g:727:31: ( PLUS_SIGN )?
                if ( stream_PLUS_SIGN.hasNext() ) {
                    adaptor.addChild(root_0, 
                    stream_PLUS_SIGN.nextNode()
                    );

                }
                stream_PLUS_SIGN.reset();

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "table_collection_expression"


    public static class subquery_restriction_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "subquery_restriction_clause"
    // PLSQL_DMLParser.g:730:1: subquery_restriction_clause : with_key ( read_key only_key | check_key option_key ( constraint_key constraint_name )? ) -> ^( with_key ( read_key )? ( check_key )? ( constraint_name )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.subquery_restriction_clause_return subquery_restriction_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.subquery_restriction_clause_return retval = new PLSQLParser_PLSQL_DMLParser.subquery_restriction_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.with_key_return with_key485 =null;

        PLSQLParser_PLSQLKeys.read_key_return read_key486 =null;

        PLSQLParser_PLSQLKeys.only_key_return only_key487 =null;

        PLSQLParser_PLSQLKeys.check_key_return check_key488 =null;

        PLSQLParser_PLSQLKeys.option_key_return option_key489 =null;

        PLSQLParser_PLSQLKeys.constraint_key_return constraint_key490 =null;

        PLSQLParser_PLSQLCommons.constraint_name_return constraint_name491 =null;


        RewriteRuleSubtreeStream stream_with_key=new RewriteRuleSubtreeStream(adaptor,"rule with_key");
        RewriteRuleSubtreeStream stream_constraint_key=new RewriteRuleSubtreeStream(adaptor,"rule constraint_key");
        RewriteRuleSubtreeStream stream_check_key=new RewriteRuleSubtreeStream(adaptor,"rule check_key");
        RewriteRuleSubtreeStream stream_option_key=new RewriteRuleSubtreeStream(adaptor,"rule option_key");
        RewriteRuleSubtreeStream stream_constraint_name=new RewriteRuleSubtreeStream(adaptor,"rule constraint_name");
        RewriteRuleSubtreeStream stream_read_key=new RewriteRuleSubtreeStream(adaptor,"rule read_key");
        RewriteRuleSubtreeStream stream_only_key=new RewriteRuleSubtreeStream(adaptor,"rule only_key");
        try {
            // PLSQL_DMLParser.g:731:5: ( with_key ( read_key only_key | check_key option_key ( constraint_key constraint_name )? ) -> ^( with_key ( read_key )? ( check_key )? ( constraint_name )? ) )
            // PLSQL_DMLParser.g:731:10: with_key ( read_key only_key | check_key option_key ( constraint_key constraint_name )? )
            {
            pushFollow(FOLLOW_with_key_in_subquery_restriction_clause6487);
            with_key485=gPLSQLParser.with_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_with_key.add(with_key485.getTree());

            // PLSQL_DMLParser.g:732:5: ( read_key only_key | check_key option_key ( constraint_key constraint_name )? )
            int alt160=2;
            int LA160_0 = input.LA(1);

            if ( (LA160_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("read")))) {
                alt160=1;
            }
            else if ( (LA160_0==SQL92_RESERVED_CHECK) ) {
                alt160=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 160, 0, input);

                throw nvae;

            }
            switch (alt160) {
                case 1 :
                    // PLSQL_DMLParser.g:732:10: read_key only_key
                    {
                    pushFollow(FOLLOW_read_key_in_subquery_restriction_clause6498);
                    read_key486=gPLSQLParser.read_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_read_key.add(read_key486.getTree());

                    pushFollow(FOLLOW_only_key_in_subquery_restriction_clause6500);
                    only_key487=gPLSQLParser.only_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_only_key.add(only_key487.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:733:10: check_key option_key ( constraint_key constraint_name )?
                    {
                    pushFollow(FOLLOW_check_key_in_subquery_restriction_clause6511);
                    check_key488=gPLSQLParser.check_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_check_key.add(check_key488.getTree());

                    pushFollow(FOLLOW_option_key_in_subquery_restriction_clause6513);
                    option_key489=gPLSQLParser.option_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_option_key.add(option_key489.getTree());

                    // PLSQL_DMLParser.g:733:31: ( constraint_key constraint_name )?
                    int alt159=2;
                    int LA159_0 = input.LA(1);

                    if ( (LA159_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("constraint")))) {
                        alt159=1;
                    }
                    switch (alt159) {
                        case 1 :
                            // PLSQL_DMLParser.g:733:32: constraint_key constraint_name
                            {
                            pushFollow(FOLLOW_constraint_key_in_subquery_restriction_clause6516);
                            constraint_key490=gPLSQLParser.constraint_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_constraint_key.add(constraint_key490.getTree());

                            pushFollow(FOLLOW_constraint_name_in_subquery_restriction_clause6518);
                            constraint_name491=gPLSQLParser.constraint_name();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_constraint_name.add(constraint_name491.getTree());

                            }
                            break;

                    }


                    }
                    break;

            }


            // AST REWRITE
            // elements: constraint_name, read_key, with_key, check_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 735:9: -> ^( with_key ( read_key )? ( check_key )? ( constraint_name )? )
            {
                // PLSQL_DMLParser.g:735:12: ^( with_key ( read_key )? ( check_key )? ( constraint_name )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_with_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:735:23: ( read_key )?
                if ( stream_read_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_read_key.nextTree());

                }
                stream_read_key.reset();

                // PLSQL_DMLParser.g:735:33: ( check_key )?
                if ( stream_check_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_check_key.nextTree());

                }
                stream_check_key.reset();

                // PLSQL_DMLParser.g:735:44: ( constraint_name )?
                if ( stream_constraint_name.hasNext() ) {
                    adaptor.addChild(root_1, stream_constraint_name.nextTree());

                }
                stream_constraint_name.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "subquery_restriction_clause"


    public static class sample_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "sample_clause"
    // PLSQL_DMLParser.g:738:1: sample_clause : sample_key ( block_key )? LEFT_PAREN expression RIGHT_PAREN ( seed_part )? -> ^( sample_key ( block_key )? ^( EXPR expression ) ( seed_part )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.sample_clause_return sample_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.sample_clause_return retval = new PLSQLParser_PLSQL_DMLParser.sample_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN494=null;
        Token RIGHT_PAREN496=null;
        PLSQLParser_PLSQLKeys.sample_key_return sample_key492 =null;

        PLSQLParser_PLSQLKeys.block_key_return block_key493 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression495 =null;

        PLSQLParser_PLSQL_DMLParser.seed_part_return seed_part497 =null;


        Object LEFT_PAREN494_tree=null;
        Object RIGHT_PAREN496_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_seed_part=new RewriteRuleSubtreeStream(adaptor,"rule seed_part");
        RewriteRuleSubtreeStream stream_sample_key=new RewriteRuleSubtreeStream(adaptor,"rule sample_key");
        RewriteRuleSubtreeStream stream_block_key=new RewriteRuleSubtreeStream(adaptor,"rule block_key");
        try {
            // PLSQL_DMLParser.g:739:5: ( sample_key ( block_key )? LEFT_PAREN expression RIGHT_PAREN ( seed_part )? -> ^( sample_key ( block_key )? ^( EXPR expression ) ( seed_part )? ) )
            // PLSQL_DMLParser.g:739:10: sample_key ( block_key )? LEFT_PAREN expression RIGHT_PAREN ( seed_part )?
            {
            pushFollow(FOLLOW_sample_key_in_sample_clause6569);
            sample_key492=gPLSQLParser.sample_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_sample_key.add(sample_key492.getTree());

            // PLSQL_DMLParser.g:739:21: ( block_key )?
            int alt161=2;
            int LA161_0 = input.LA(1);

            if ( (LA161_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("block")))) {
                alt161=1;
            }
            switch (alt161) {
                case 1 :
                    // PLSQL_DMLParser.g:739:21: block_key
                    {
                    pushFollow(FOLLOW_block_key_in_sample_clause6571);
                    block_key493=gPLSQLParser.block_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_block_key.add(block_key493.getTree());

                    }
                    break;

            }


            LEFT_PAREN494=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_sample_clause6583); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN494);


            pushFollow(FOLLOW_expression_in_sample_clause6585);
            expression495=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression495.getTree());

            RIGHT_PAREN496=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_sample_clause6587); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN496);


            // PLSQL_DMLParser.g:741:9: ( seed_part )?
            int alt162=2;
            int LA162_0 = input.LA(1);

            if ( (LA162_0==REGULAR_ID) ) {
                int LA162_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("seed"))) ) {
                    alt162=1;
                }
            }
            switch (alt162) {
                case 1 :
                    // PLSQL_DMLParser.g:741:9: seed_part
                    {
                    pushFollow(FOLLOW_seed_part_in_sample_clause6597);
                    seed_part497=seed_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_seed_part.add(seed_part497.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: seed_part, block_key, expression, sample_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 742:9: -> ^( sample_key ( block_key )? ^( EXPR expression ) ( seed_part )? )
            {
                // PLSQL_DMLParser.g:742:12: ^( sample_key ( block_key )? ^( EXPR expression ) ( seed_part )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_sample_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:742:25: ( block_key )?
                if ( stream_block_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_block_key.nextTree());

                }
                stream_block_key.reset();

                // PLSQL_DMLParser.g:742:36: ^( EXPR expression )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_expression.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                // PLSQL_DMLParser.g:742:55: ( seed_part )?
                if ( stream_seed_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_seed_part.nextTree());

                }
                stream_seed_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "sample_clause"


    public static class seed_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "seed_part"
    // PLSQL_DMLParser.g:745:1: seed_part : seed_key LEFT_PAREN expression RIGHT_PAREN -> ^( seed_key ^( EXPR expression ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.seed_part_return seed_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.seed_part_return retval = new PLSQLParser_PLSQL_DMLParser.seed_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN499=null;
        Token RIGHT_PAREN501=null;
        PLSQLParser_PLSQLKeys.seed_key_return seed_key498 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression500 =null;


        Object LEFT_PAREN499_tree=null;
        Object RIGHT_PAREN501_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_seed_key=new RewriteRuleSubtreeStream(adaptor,"rule seed_key");
        try {
            // PLSQL_DMLParser.g:746:5: ( seed_key LEFT_PAREN expression RIGHT_PAREN -> ^( seed_key ^( EXPR expression ) ) )
            // PLSQL_DMLParser.g:746:10: seed_key LEFT_PAREN expression RIGHT_PAREN
            {
            pushFollow(FOLLOW_seed_key_in_seed_part6645);
            seed_key498=gPLSQLParser.seed_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_seed_key.add(seed_key498.getTree());

            LEFT_PAREN499=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_seed_part6647); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN499);


            pushFollow(FOLLOW_expression_in_seed_part6649);
            expression500=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression500.getTree());

            RIGHT_PAREN501=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_seed_part6651); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN501);


            // AST REWRITE
            // elements: seed_key, expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 747:9: -> ^( seed_key ^( EXPR expression ) )
            {
                // PLSQL_DMLParser.g:747:12: ^( seed_key ^( EXPR expression ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_seed_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:747:23: ^( EXPR expression )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_expression.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "seed_part"


    public static class expression_list_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "expression_list"
    // PLSQL_DMLParser.g:754:1: expression_list : LEFT_PAREN ( expression )? ( COMMA expression )* RIGHT_PAREN -> ^( EXPR_LIST ( ^( EXPR expression ) )* ) ;
    public final PLSQLParser_PLSQL_DMLParser.expression_list_return expression_list() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.expression_list_return retval = new PLSQLParser_PLSQL_DMLParser.expression_list_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN502=null;
        Token COMMA504=null;
        Token RIGHT_PAREN506=null;
        PLSQLParser_PLSQL_DMLParser.expression_return expression503 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression505 =null;


        Object LEFT_PAREN502_tree=null;
        Object COMMA504_tree=null;
        Object RIGHT_PAREN506_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        try {
            // PLSQL_DMLParser.g:755:5: ( LEFT_PAREN ( expression )? ( COMMA expression )* RIGHT_PAREN -> ^( EXPR_LIST ( ^( EXPR expression ) )* ) )
            // PLSQL_DMLParser.g:755:10: LEFT_PAREN ( expression )? ( COMMA expression )* RIGHT_PAREN
            {
            LEFT_PAREN502=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_expression_list6695); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN502);


            // PLSQL_DMLParser.g:755:21: ( expression )?
            int alt163=2;
            int LA163_0 = input.LA(1);

            if ( (LA163_0==APPROXIMATE_NUM_LIT||(LA163_0 >= CHAR_STRING && LA163_0 <= COLON)||LA163_0==DELIMITED_ID||LA163_0==EXACT_NUM_LIT||LA163_0==INTRODUCER||LA163_0==LEFT_PAREN||LA163_0==MINUS_SIGN||LA163_0==PLUS_SIGN||LA163_0==REGULAR_ID||LA163_0==SQL92_RESERVED_ALL||LA163_0==SQL92_RESERVED_ANY||LA163_0==SQL92_RESERVED_CASE||LA163_0==SQL92_RESERVED_DEFAULT||LA163_0==SQL92_RESERVED_DISTINCT||(LA163_0 >= SQL92_RESERVED_EXISTS && LA163_0 <= SQL92_RESERVED_FALSE)||(LA163_0 >= SQL92_RESERVED_NOT && LA163_0 <= SQL92_RESERVED_NULL)||LA163_0==SQL92_RESERVED_PRIOR||LA163_0==SQL92_RESERVED_TRUE||LA163_0==UNSIGNED_INTEGER) ) {
                alt163=1;
            }
            switch (alt163) {
                case 1 :
                    // PLSQL_DMLParser.g:755:21: expression
                    {
                    pushFollow(FOLLOW_expression_in_expression_list6697);
                    expression503=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(expression503.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:755:33: ( COMMA expression )*
            loop164:
            do {
                int alt164=2;
                int LA164_0 = input.LA(1);

                if ( (LA164_0==COMMA) ) {
                    alt164=1;
                }


                switch (alt164) {
            	case 1 :
            	    // PLSQL_DMLParser.g:755:34: COMMA expression
            	    {
            	    COMMA504=(Token)match(input,COMMA,FOLLOW_COMMA_in_expression_list6701); if (state.failed) return retval; 
            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA504);


            	    pushFollow(FOLLOW_expression_in_expression_list6703);
            	    expression505=expression();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_expression.add(expression505.getTree());

            	    }
            	    break;

            	default :
            	    break loop164;
                }
            } while (true);


            RIGHT_PAREN506=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_expression_list6707); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN506);


            // AST REWRITE
            // elements: expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 756:9: -> ^( EXPR_LIST ( ^( EXPR expression ) )* )
            {
                // PLSQL_DMLParser.g:756:12: ^( EXPR_LIST ( ^( EXPR expression ) )* )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR_LIST, "EXPR_LIST")
                , root_1);

                // PLSQL_DMLParser.g:756:24: ( ^( EXPR expression ) )*
                while ( stream_expression.hasNext() ) {
                    // PLSQL_DMLParser.g:756:24: ^( EXPR expression )
                    {
                    Object root_2 = (Object)adaptor.nil();
                    root_2 = (Object)adaptor.becomeRoot(
                    (Object)adaptor.create(EXPR, "EXPR")
                    , root_2);

                    adaptor.addChild(root_2, stream_expression.nextTree());

                    adaptor.addChild(root_1, root_2);
                    }

                }
                stream_expression.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "expression_list"


    public static class condition_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "condition"
    // PLSQL_DMLParser.g:759:1: condition : expression ;
    public final PLSQLParser_PLSQL_DMLParser.condition_return condition() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.condition_return retval = new PLSQLParser_PLSQL_DMLParser.condition_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression507 =null;



        try {
            // PLSQL_DMLParser.g:760:5: ( expression )
            // PLSQL_DMLParser.g:760:11: expression
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_expression_in_condition6749);
            expression507=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, expression507.getTree());

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "condition"


    public static class condition_wrapper_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "condition_wrapper"
    // PLSQL_DMLParser.g:763:1: condition_wrapper : expression -> ^( LOGIC_EXPR expression ) ;
    public final PLSQLParser_PLSQL_DMLParser.condition_wrapper_return condition_wrapper() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.condition_wrapper_return retval = new PLSQLParser_PLSQL_DMLParser.condition_wrapper_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression508 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        try {
            // PLSQL_DMLParser.g:764:5: ( expression -> ^( LOGIC_EXPR expression ) )
            // PLSQL_DMLParser.g:764:10: expression
            {
            pushFollow(FOLLOW_expression_in_condition_wrapper6769);
            expression508=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression508.getTree());

            // AST REWRITE
            // elements: expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 765:9: -> ^( LOGIC_EXPR expression )
            {
                // PLSQL_DMLParser.g:765:12: ^( LOGIC_EXPR expression )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(LOGIC_EXPR, "LOGIC_EXPR")
                , root_1);

                adaptor.addChild(root_1, stream_expression.nextTree());

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "condition_wrapper"


    public static class expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "expression"
    // PLSQL_DMLParser.g:768:1: expression : logical_and_expression ( or_key ^ logical_and_expression )* ;
    public final PLSQLParser_PLSQL_DMLParser.expression_return expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.expression_return retval = new PLSQLParser_PLSQL_DMLParser.expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.logical_and_expression_return logical_and_expression509 =null;

        PLSQLParser_PLSQLKeys.or_key_return or_key510 =null;

        PLSQLParser_PLSQL_DMLParser.logical_and_expression_return logical_and_expression511 =null;



        try {
            // PLSQL_DMLParser.g:769:5: ( logical_and_expression ( or_key ^ logical_and_expression )* )
            // PLSQL_DMLParser.g:769:10: logical_and_expression ( or_key ^ logical_and_expression )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_logical_and_expression_in_expression6805);
            logical_and_expression509=logical_and_expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, logical_and_expression509.getTree());

            // PLSQL_DMLParser.g:769:33: ( or_key ^ logical_and_expression )*
            loop165:
            do {
                int alt165=2;
                int LA165_0 = input.LA(1);

                if ( (LA165_0==SQL92_RESERVED_OR) ) {
                    alt165=1;
                }


                switch (alt165) {
            	case 1 :
            	    // PLSQL_DMLParser.g:769:35: or_key ^ logical_and_expression
            	    {
            	    pushFollow(FOLLOW_or_key_in_expression6809);
            	    or_key510=gPLSQLParser.or_key();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(or_key510.getTree(), root_0);

            	    pushFollow(FOLLOW_logical_and_expression_in_expression6812);
            	    logical_and_expression511=logical_and_expression();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, logical_and_expression511.getTree());

            	    }
            	    break;

            	default :
            	    break loop165;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "expression"


    public static class expression_wrapper_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "expression_wrapper"
    // PLSQL_DMLParser.g:772:1: expression_wrapper : expression -> ^( EXPR expression ) ;
    public final PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return retval = new PLSQLParser_PLSQL_DMLParser.expression_wrapper_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression512 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        try {
            // PLSQL_DMLParser.g:773:5: ( expression -> ^( EXPR expression ) )
            // PLSQL_DMLParser.g:773:10: expression
            {
            pushFollow(FOLLOW_expression_in_expression_wrapper6839);
            expression512=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression512.getTree());

            // AST REWRITE
            // elements: expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 774:9: -> ^( EXPR expression )
            {
                // PLSQL_DMLParser.g:774:12: ^( EXPR expression )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_1);

                adaptor.addChild(root_1, stream_expression.nextTree());

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "expression_wrapper"


    public static class logical_and_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "logical_and_expression"
    // PLSQL_DMLParser.g:777:1: logical_and_expression : negated_expression ( and_key ^ negated_expression )* ;
    public final PLSQLParser_PLSQL_DMLParser.logical_and_expression_return logical_and_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.logical_and_expression_return retval = new PLSQLParser_PLSQL_DMLParser.logical_and_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.negated_expression_return negated_expression513 =null;

        PLSQLParser_PLSQLKeys.and_key_return and_key514 =null;

        PLSQLParser_PLSQL_DMLParser.negated_expression_return negated_expression515 =null;



        try {
            // PLSQL_DMLParser.g:778:5: ( negated_expression ( and_key ^ negated_expression )* )
            // PLSQL_DMLParser.g:778:10: negated_expression ( and_key ^ negated_expression )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_negated_expression_in_logical_and_expression6875);
            negated_expression513=negated_expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, negated_expression513.getTree());

            // PLSQL_DMLParser.g:778:29: ( and_key ^ negated_expression )*
            loop166:
            do {
                int alt166=2;
                int LA166_0 = input.LA(1);

                if ( (LA166_0==SQL92_RESERVED_AND) ) {
                    alt166=1;
                }


                switch (alt166) {
            	case 1 :
            	    // PLSQL_DMLParser.g:778:31: and_key ^ negated_expression
            	    {
            	    pushFollow(FOLLOW_and_key_in_logical_and_expression6879);
            	    and_key514=gPLSQLParser.and_key();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(and_key514.getTree(), root_0);

            	    pushFollow(FOLLOW_negated_expression_in_logical_and_expression6882);
            	    negated_expression515=negated_expression();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, negated_expression515.getTree());

            	    }
            	    break;

            	default :
            	    break loop166;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "logical_and_expression"


    public static class negated_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "negated_expression"
    // PLSQL_DMLParser.g:781:1: negated_expression : ( not_key ^ negated_expression | equality_expression );
    public final PLSQLParser_PLSQL_DMLParser.negated_expression_return negated_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.negated_expression_return retval = new PLSQLParser_PLSQL_DMLParser.negated_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.not_key_return not_key516 =null;

        PLSQLParser_PLSQL_DMLParser.negated_expression_return negated_expression517 =null;

        PLSQLParser_PLSQL_DMLParser.equality_expression_return equality_expression518 =null;



        try {
            // PLSQL_DMLParser.g:782:5: ( not_key ^ negated_expression | equality_expression )
            int alt167=2;
            int LA167_0 = input.LA(1);

            if ( (LA167_0==SQL92_RESERVED_NOT) ) {
                alt167=1;
            }
            else if ( (LA167_0==APPROXIMATE_NUM_LIT||(LA167_0 >= CHAR_STRING && LA167_0 <= COLON)||LA167_0==DELIMITED_ID||LA167_0==EXACT_NUM_LIT||LA167_0==INTRODUCER||LA167_0==LEFT_PAREN||LA167_0==MINUS_SIGN||LA167_0==PLUS_SIGN||LA167_0==REGULAR_ID||LA167_0==SQL92_RESERVED_ALL||LA167_0==SQL92_RESERVED_ANY||LA167_0==SQL92_RESERVED_CASE||LA167_0==SQL92_RESERVED_DEFAULT||LA167_0==SQL92_RESERVED_DISTINCT||(LA167_0 >= SQL92_RESERVED_EXISTS && LA167_0 <= SQL92_RESERVED_FALSE)||LA167_0==SQL92_RESERVED_NULL||LA167_0==SQL92_RESERVED_PRIOR||LA167_0==SQL92_RESERVED_TRUE||LA167_0==UNSIGNED_INTEGER) ) {
                alt167=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 167, 0, input);

                throw nvae;

            }
            switch (alt167) {
                case 1 :
                    // PLSQL_DMLParser.g:782:10: not_key ^ negated_expression
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_not_key_in_negated_expression6905);
                    not_key516=gPLSQLParser.not_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(not_key516.getTree(), root_0);

                    pushFollow(FOLLOW_negated_expression_in_negated_expression6908);
                    negated_expression517=negated_expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, negated_expression517.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:783:10: equality_expression
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_equality_expression_in_negated_expression6919);
                    equality_expression518=equality_expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, equality_expression518.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "negated_expression"


    public static class equality_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "equality_expression"
    // PLSQL_DMLParser.g:786:1: equality_expression : ( multiset_expression -> multiset_expression ) ( is_key ( not_key )? ( null_key -> {isNegated}? ^( IS_NOT_NULL $equality_expression) -> ^( IS_NULL $equality_expression) | nan_key -> {isNegated}? ^( IS_NOT_NAN $equality_expression) -> ^( IS_NAN $equality_expression) | present_key -> {isNegated}? ^( IS_NOT_PRESENT $equality_expression) -> ^( IS_PRESENT $equality_expression) | infinite_key -> {isNegated}? ^( IS_NOT_INFINITE $equality_expression) -> ^( IS_INFINITE $equality_expression) | a_key set_key -> {isNegated}? ^( IS_NOT_A_SET $equality_expression) -> ^( IS_A_SET $equality_expression) | empty_key -> {isNegated}? ^( IS_NOT_EMPTY $equality_expression) -> ^( IS_EMPTY $equality_expression) | of_key ( type_key )? LEFT_PAREN type_spec ( COMMA type_spec )* RIGHT_PAREN -> {isNegated}? ^( IS_NOT_OF_TYPE $equality_expression ( type_spec )+ ) -> ^( IS_OF_TYPE $equality_expression ( type_spec )+ ) ) )* ;
    public final PLSQLParser_PLSQL_DMLParser.equality_expression_return equality_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.equality_expression_return retval = new PLSQLParser_PLSQL_DMLParser.equality_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN531=null;
        Token COMMA533=null;
        Token RIGHT_PAREN535=null;
        PLSQLParser_PLSQL_DMLParser.multiset_expression_return multiset_expression519 =null;

        PLSQLParser_PLSQLKeys.is_key_return is_key520 =null;

        PLSQLParser_PLSQLKeys.not_key_return not_key521 =null;

        PLSQLParser_PLSQLKeys.null_key_return null_key522 =null;

        PLSQLParser_PLSQLKeys.nan_key_return nan_key523 =null;

        PLSQLParser_PLSQLKeys.present_key_return present_key524 =null;

        PLSQLParser_PLSQLKeys.infinite_key_return infinite_key525 =null;

        PLSQLParser_PLSQLKeys.a_key_return a_key526 =null;

        PLSQLParser_PLSQLKeys.set_key_return set_key527 =null;

        PLSQLParser_PLSQLKeys.empty_key_return empty_key528 =null;

        PLSQLParser_PLSQLKeys.of_key_return of_key529 =null;

        PLSQLParser_PLSQLKeys.type_key_return type_key530 =null;

        PLSQLParser_PLSQLCommons.type_spec_return type_spec532 =null;

        PLSQLParser_PLSQLCommons.type_spec_return type_spec534 =null;


        Object LEFT_PAREN531_tree=null;
        Object COMMA533_tree=null;
        Object RIGHT_PAREN535_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_type_spec=new RewriteRuleSubtreeStream(adaptor,"rule type_spec");
        RewriteRuleSubtreeStream stream_null_key=new RewriteRuleSubtreeStream(adaptor,"rule null_key");
        RewriteRuleSubtreeStream stream_a_key=new RewriteRuleSubtreeStream(adaptor,"rule a_key");
        RewriteRuleSubtreeStream stream_infinite_key=new RewriteRuleSubtreeStream(adaptor,"rule infinite_key");
        RewriteRuleSubtreeStream stream_multiset_expression=new RewriteRuleSubtreeStream(adaptor,"rule multiset_expression");
        RewriteRuleSubtreeStream stream_is_key=new RewriteRuleSubtreeStream(adaptor,"rule is_key");
        RewriteRuleSubtreeStream stream_present_key=new RewriteRuleSubtreeStream(adaptor,"rule present_key");
        RewriteRuleSubtreeStream stream_nan_key=new RewriteRuleSubtreeStream(adaptor,"rule nan_key");
        RewriteRuleSubtreeStream stream_empty_key=new RewriteRuleSubtreeStream(adaptor,"rule empty_key");
        RewriteRuleSubtreeStream stream_not_key=new RewriteRuleSubtreeStream(adaptor,"rule not_key");
        RewriteRuleSubtreeStream stream_set_key=new RewriteRuleSubtreeStream(adaptor,"rule set_key");
        RewriteRuleSubtreeStream stream_of_key=new RewriteRuleSubtreeStream(adaptor,"rule of_key");
        RewriteRuleSubtreeStream stream_type_key=new RewriteRuleSubtreeStream(adaptor,"rule type_key");
            boolean isNegated = false;    
        try {
            // PLSQL_DMLParser.g:788:5: ( ( multiset_expression -> multiset_expression ) ( is_key ( not_key )? ( null_key -> {isNegated}? ^( IS_NOT_NULL $equality_expression) -> ^( IS_NULL $equality_expression) | nan_key -> {isNegated}? ^( IS_NOT_NAN $equality_expression) -> ^( IS_NAN $equality_expression) | present_key -> {isNegated}? ^( IS_NOT_PRESENT $equality_expression) -> ^( IS_PRESENT $equality_expression) | infinite_key -> {isNegated}? ^( IS_NOT_INFINITE $equality_expression) -> ^( IS_INFINITE $equality_expression) | a_key set_key -> {isNegated}? ^( IS_NOT_A_SET $equality_expression) -> ^( IS_A_SET $equality_expression) | empty_key -> {isNegated}? ^( IS_NOT_EMPTY $equality_expression) -> ^( IS_EMPTY $equality_expression) | of_key ( type_key )? LEFT_PAREN type_spec ( COMMA type_spec )* RIGHT_PAREN -> {isNegated}? ^( IS_NOT_OF_TYPE $equality_expression ( type_spec )+ ) -> ^( IS_OF_TYPE $equality_expression ( type_spec )+ ) ) )* )
            // PLSQL_DMLParser.g:788:10: ( multiset_expression -> multiset_expression ) ( is_key ( not_key )? ( null_key -> {isNegated}? ^( IS_NOT_NULL $equality_expression) -> ^( IS_NULL $equality_expression) | nan_key -> {isNegated}? ^( IS_NOT_NAN $equality_expression) -> ^( IS_NAN $equality_expression) | present_key -> {isNegated}? ^( IS_NOT_PRESENT $equality_expression) -> ^( IS_PRESENT $equality_expression) | infinite_key -> {isNegated}? ^( IS_NOT_INFINITE $equality_expression) -> ^( IS_INFINITE $equality_expression) | a_key set_key -> {isNegated}? ^( IS_NOT_A_SET $equality_expression) -> ^( IS_A_SET $equality_expression) | empty_key -> {isNegated}? ^( IS_NOT_EMPTY $equality_expression) -> ^( IS_EMPTY $equality_expression) | of_key ( type_key )? LEFT_PAREN type_spec ( COMMA type_spec )* RIGHT_PAREN -> {isNegated}? ^( IS_NOT_OF_TYPE $equality_expression ( type_spec )+ ) -> ^( IS_OF_TYPE $equality_expression ( type_spec )+ ) ) )*
            {
            // PLSQL_DMLParser.g:788:10: ( multiset_expression -> multiset_expression )
            // PLSQL_DMLParser.g:788:11: multiset_expression
            {
            pushFollow(FOLLOW_multiset_expression_in_equality_expression6948);
            multiset_expression519=multiset_expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_multiset_expression.add(multiset_expression519.getTree());

            // AST REWRITE
            // elements: multiset_expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 788:31: -> multiset_expression
            {
                adaptor.addChild(root_0, stream_multiset_expression.nextTree());

            }


            retval.tree = root_0;
            }

            }


            // PLSQL_DMLParser.g:789:5: ( is_key ( not_key )? ( null_key -> {isNegated}? ^( IS_NOT_NULL $equality_expression) -> ^( IS_NULL $equality_expression) | nan_key -> {isNegated}? ^( IS_NOT_NAN $equality_expression) -> ^( IS_NAN $equality_expression) | present_key -> {isNegated}? ^( IS_NOT_PRESENT $equality_expression) -> ^( IS_PRESENT $equality_expression) | infinite_key -> {isNegated}? ^( IS_NOT_INFINITE $equality_expression) -> ^( IS_INFINITE $equality_expression) | a_key set_key -> {isNegated}? ^( IS_NOT_A_SET $equality_expression) -> ^( IS_A_SET $equality_expression) | empty_key -> {isNegated}? ^( IS_NOT_EMPTY $equality_expression) -> ^( IS_EMPTY $equality_expression) | of_key ( type_key )? LEFT_PAREN type_spec ( COMMA type_spec )* RIGHT_PAREN -> {isNegated}? ^( IS_NOT_OF_TYPE $equality_expression ( type_spec )+ ) -> ^( IS_OF_TYPE $equality_expression ( type_spec )+ ) ) )*
            loop172:
            do {
                int alt172=2;
                int LA172_0 = input.LA(1);

                if ( (LA172_0==SQL92_RESERVED_IS) ) {
                    alt172=1;
                }


                switch (alt172) {
            	case 1 :
            	    // PLSQL_DMLParser.g:789:10: is_key ( not_key )? ( null_key -> {isNegated}? ^( IS_NOT_NULL $equality_expression) -> ^( IS_NULL $equality_expression) | nan_key -> {isNegated}? ^( IS_NOT_NAN $equality_expression) -> ^( IS_NAN $equality_expression) | present_key -> {isNegated}? ^( IS_NOT_PRESENT $equality_expression) -> ^( IS_PRESENT $equality_expression) | infinite_key -> {isNegated}? ^( IS_NOT_INFINITE $equality_expression) -> ^( IS_INFINITE $equality_expression) | a_key set_key -> {isNegated}? ^( IS_NOT_A_SET $equality_expression) -> ^( IS_A_SET $equality_expression) | empty_key -> {isNegated}? ^( IS_NOT_EMPTY $equality_expression) -> ^( IS_EMPTY $equality_expression) | of_key ( type_key )? LEFT_PAREN type_spec ( COMMA type_spec )* RIGHT_PAREN -> {isNegated}? ^( IS_NOT_OF_TYPE $equality_expression ( type_spec )+ ) -> ^( IS_OF_TYPE $equality_expression ( type_spec )+ ) )
            	    {
            	    pushFollow(FOLLOW_is_key_in_equality_expression6964);
            	    is_key520=gPLSQLParser.is_key();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_is_key.add(is_key520.getTree());

            	    // PLSQL_DMLParser.g:789:17: ( not_key )?
            	    int alt168=2;
            	    int LA168_0 = input.LA(1);

            	    if ( (LA168_0==SQL92_RESERVED_NOT) ) {
            	        alt168=1;
            	    }
            	    switch (alt168) {
            	        case 1 :
            	            // PLSQL_DMLParser.g:789:18: not_key
            	            {
            	            pushFollow(FOLLOW_not_key_in_equality_expression6967);
            	            not_key521=gPLSQLParser.not_key();

            	            state._fsp--;
            	            if (state.failed) return retval;
            	            if ( state.backtracking==0 ) stream_not_key.add(not_key521.getTree());

            	            if ( state.backtracking==0 ) {isNegated = true;}

            	            }
            	            break;

            	    }


            	    // PLSQL_DMLParser.g:790:9: ( null_key -> {isNegated}? ^( IS_NOT_NULL $equality_expression) -> ^( IS_NULL $equality_expression) | nan_key -> {isNegated}? ^( IS_NOT_NAN $equality_expression) -> ^( IS_NAN $equality_expression) | present_key -> {isNegated}? ^( IS_NOT_PRESENT $equality_expression) -> ^( IS_PRESENT $equality_expression) | infinite_key -> {isNegated}? ^( IS_NOT_INFINITE $equality_expression) -> ^( IS_INFINITE $equality_expression) | a_key set_key -> {isNegated}? ^( IS_NOT_A_SET $equality_expression) -> ^( IS_A_SET $equality_expression) | empty_key -> {isNegated}? ^( IS_NOT_EMPTY $equality_expression) -> ^( IS_EMPTY $equality_expression) | of_key ( type_key )? LEFT_PAREN type_spec ( COMMA type_spec )* RIGHT_PAREN -> {isNegated}? ^( IS_NOT_OF_TYPE $equality_expression ( type_spec )+ ) -> ^( IS_OF_TYPE $equality_expression ( type_spec )+ ) )
            	    int alt171=7;
            	    int LA171_0 = input.LA(1);

            	    if ( (LA171_0==SQL92_RESERVED_NULL) ) {
            	        alt171=1;
            	    }
            	    else if ( (LA171_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("empty"))||(input.LT(1).getText().equalsIgnoreCase("present"))||(input.LT(1).getText().equalsIgnoreCase("infinite"))||(input.LT(1).getText().equalsIgnoreCase("nan"))||(input.LT(1).getText().equalsIgnoreCase("a"))))) {
            	        int LA171_2 = input.LA(2);

            	        if ( (LA171_2==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("a")))) {
            	            alt171=5;
            	        }
            	        else if ( ((input.LT(1).getText().equalsIgnoreCase("nan"))) ) {
            	            alt171=2;
            	        }
            	        else if ( ((input.LT(1).getText().equalsIgnoreCase("present"))) ) {
            	            alt171=3;
            	        }
            	        else if ( ((input.LT(1).getText().equalsIgnoreCase("infinite"))) ) {
            	            alt171=4;
            	        }
            	        else if ( ((input.LT(1).getText().equalsIgnoreCase("empty"))) ) {
            	            alt171=6;
            	        }
            	        else {
            	            if (state.backtracking>0) {state.failed=true; return retval;}
            	            NoViableAltException nvae =
            	                new NoViableAltException("", 171, 2, input);

            	            throw nvae;

            	        }
            	    }
            	    else if ( (LA171_0==SQL92_RESERVED_OF) ) {
            	        alt171=7;
            	    }
            	    else {
            	        if (state.backtracking>0) {state.failed=true; return retval;}
            	        NoViableAltException nvae =
            	            new NoViableAltException("", 171, 0, input);

            	        throw nvae;

            	    }
            	    switch (alt171) {
            	        case 1 :
            	            // PLSQL_DMLParser.g:790:14: null_key
            	            {
            	            pushFollow(FOLLOW_null_key_in_equality_expression6986);
            	            null_key522=gPLSQLParser.null_key();

            	            state._fsp--;
            	            if (state.failed) return retval;
            	            if ( state.backtracking==0 ) stream_null_key.add(null_key522.getTree());

            	            // AST REWRITE
            	            // elements: equality_expression, equality_expression
            	            // token labels: 
            	            // rule labels: retval
            	            // token list labels: 
            	            // rule list labels: 
            	            // wildcard labels: 
            	            if ( state.backtracking==0 ) {

            	            retval.tree = root_0;
            	            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            	            root_0 = (Object)adaptor.nil();
            	            // 791:17: -> {isNegated}? ^( IS_NOT_NULL $equality_expression)
            	            if (isNegated) {
            	                // PLSQL_DMLParser.g:791:33: ^( IS_NOT_NULL $equality_expression)
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_NOT_NULL, "IS_NOT_NULL")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }

            	            else // 792:17: -> ^( IS_NULL $equality_expression)
            	            {
            	                // PLSQL_DMLParser.g:792:20: ^( IS_NULL $equality_expression)
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_NULL, "IS_NULL")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }


            	            retval.tree = root_0;
            	            }

            	            }
            	            break;
            	        case 2 :
            	            // PLSQL_DMLParser.g:793:14: nan_key
            	            {
            	            pushFollow(FOLLOW_nan_key_in_equality_expression7053);
            	            nan_key523=gPLSQLParser.nan_key();

            	            state._fsp--;
            	            if (state.failed) return retval;
            	            if ( state.backtracking==0 ) stream_nan_key.add(nan_key523.getTree());

            	            // AST REWRITE
            	            // elements: equality_expression, equality_expression
            	            // token labels: 
            	            // rule labels: retval
            	            // token list labels: 
            	            // rule list labels: 
            	            // wildcard labels: 
            	            if ( state.backtracking==0 ) {

            	            retval.tree = root_0;
            	            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            	            root_0 = (Object)adaptor.nil();
            	            // 794:17: -> {isNegated}? ^( IS_NOT_NAN $equality_expression)
            	            if (isNegated) {
            	                // PLSQL_DMLParser.g:794:33: ^( IS_NOT_NAN $equality_expression)
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_NOT_NAN, "IS_NOT_NAN")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }

            	            else // 795:17: -> ^( IS_NAN $equality_expression)
            	            {
            	                // PLSQL_DMLParser.g:795:20: ^( IS_NAN $equality_expression)
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_NAN, "IS_NAN")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }


            	            retval.tree = root_0;
            	            }

            	            }
            	            break;
            	        case 3 :
            	            // PLSQL_DMLParser.g:796:14: present_key
            	            {
            	            pushFollow(FOLLOW_present_key_in_equality_expression7120);
            	            present_key524=gPLSQLParser.present_key();

            	            state._fsp--;
            	            if (state.failed) return retval;
            	            if ( state.backtracking==0 ) stream_present_key.add(present_key524.getTree());

            	            // AST REWRITE
            	            // elements: equality_expression, equality_expression
            	            // token labels: 
            	            // rule labels: retval
            	            // token list labels: 
            	            // rule list labels: 
            	            // wildcard labels: 
            	            if ( state.backtracking==0 ) {

            	            retval.tree = root_0;
            	            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            	            root_0 = (Object)adaptor.nil();
            	            // 797:17: -> {isNegated}? ^( IS_NOT_PRESENT $equality_expression)
            	            if (isNegated) {
            	                // PLSQL_DMLParser.g:797:33: ^( IS_NOT_PRESENT $equality_expression)
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_NOT_PRESENT, "IS_NOT_PRESENT")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }

            	            else // 798:17: -> ^( IS_PRESENT $equality_expression)
            	            {
            	                // PLSQL_DMLParser.g:798:20: ^( IS_PRESENT $equality_expression)
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_PRESENT, "IS_PRESENT")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }


            	            retval.tree = root_0;
            	            }

            	            }
            	            break;
            	        case 4 :
            	            // PLSQL_DMLParser.g:799:14: infinite_key
            	            {
            	            pushFollow(FOLLOW_infinite_key_in_equality_expression7187);
            	            infinite_key525=gPLSQLParser.infinite_key();

            	            state._fsp--;
            	            if (state.failed) return retval;
            	            if ( state.backtracking==0 ) stream_infinite_key.add(infinite_key525.getTree());

            	            // AST REWRITE
            	            // elements: equality_expression, equality_expression
            	            // token labels: 
            	            // rule labels: retval
            	            // token list labels: 
            	            // rule list labels: 
            	            // wildcard labels: 
            	            if ( state.backtracking==0 ) {

            	            retval.tree = root_0;
            	            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            	            root_0 = (Object)adaptor.nil();
            	            // 800:17: -> {isNegated}? ^( IS_NOT_INFINITE $equality_expression)
            	            if (isNegated) {
            	                // PLSQL_DMLParser.g:800:33: ^( IS_NOT_INFINITE $equality_expression)
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_NOT_INFINITE, "IS_NOT_INFINITE")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }

            	            else // 801:17: -> ^( IS_INFINITE $equality_expression)
            	            {
            	                // PLSQL_DMLParser.g:801:20: ^( IS_INFINITE $equality_expression)
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_INFINITE, "IS_INFINITE")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }


            	            retval.tree = root_0;
            	            }

            	            }
            	            break;
            	        case 5 :
            	            // PLSQL_DMLParser.g:802:14: a_key set_key
            	            {
            	            pushFollow(FOLLOW_a_key_in_equality_expression7254);
            	            a_key526=gPLSQLParser.a_key();

            	            state._fsp--;
            	            if (state.failed) return retval;
            	            if ( state.backtracking==0 ) stream_a_key.add(a_key526.getTree());

            	            pushFollow(FOLLOW_set_key_in_equality_expression7256);
            	            set_key527=gPLSQLParser.set_key();

            	            state._fsp--;
            	            if (state.failed) return retval;
            	            if ( state.backtracking==0 ) stream_set_key.add(set_key527.getTree());

            	            // AST REWRITE
            	            // elements: equality_expression, equality_expression
            	            // token labels: 
            	            // rule labels: retval
            	            // token list labels: 
            	            // rule list labels: 
            	            // wildcard labels: 
            	            if ( state.backtracking==0 ) {

            	            retval.tree = root_0;
            	            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            	            root_0 = (Object)adaptor.nil();
            	            // 803:17: -> {isNegated}? ^( IS_NOT_A_SET $equality_expression)
            	            if (isNegated) {
            	                // PLSQL_DMLParser.g:803:33: ^( IS_NOT_A_SET $equality_expression)
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_NOT_A_SET, "IS_NOT_A_SET")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }

            	            else // 804:17: -> ^( IS_A_SET $equality_expression)
            	            {
            	                // PLSQL_DMLParser.g:804:20: ^( IS_A_SET $equality_expression)
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_A_SET, "IS_A_SET")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }


            	            retval.tree = root_0;
            	            }

            	            }
            	            break;
            	        case 6 :
            	            // PLSQL_DMLParser.g:805:14: empty_key
            	            {
            	            pushFollow(FOLLOW_empty_key_in_equality_expression7323);
            	            empty_key528=gPLSQLParser.empty_key();

            	            state._fsp--;
            	            if (state.failed) return retval;
            	            if ( state.backtracking==0 ) stream_empty_key.add(empty_key528.getTree());

            	            // AST REWRITE
            	            // elements: equality_expression, equality_expression
            	            // token labels: 
            	            // rule labels: retval
            	            // token list labels: 
            	            // rule list labels: 
            	            // wildcard labels: 
            	            if ( state.backtracking==0 ) {

            	            retval.tree = root_0;
            	            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            	            root_0 = (Object)adaptor.nil();
            	            // 806:17: -> {isNegated}? ^( IS_NOT_EMPTY $equality_expression)
            	            if (isNegated) {
            	                // PLSQL_DMLParser.g:806:33: ^( IS_NOT_EMPTY $equality_expression)
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_NOT_EMPTY, "IS_NOT_EMPTY")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }

            	            else // 807:17: -> ^( IS_EMPTY $equality_expression)
            	            {
            	                // PLSQL_DMLParser.g:807:20: ^( IS_EMPTY $equality_expression)
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_EMPTY, "IS_EMPTY")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }


            	            retval.tree = root_0;
            	            }

            	            }
            	            break;
            	        case 7 :
            	            // PLSQL_DMLParser.g:808:14: of_key ( type_key )? LEFT_PAREN type_spec ( COMMA type_spec )* RIGHT_PAREN
            	            {
            	            pushFollow(FOLLOW_of_key_in_equality_expression7390);
            	            of_key529=gPLSQLParser.of_key();

            	            state._fsp--;
            	            if (state.failed) return retval;
            	            if ( state.backtracking==0 ) stream_of_key.add(of_key529.getTree());

            	            // PLSQL_DMLParser.g:808:21: ( type_key )?
            	            int alt169=2;
            	            int LA169_0 = input.LA(1);

            	            if ( (LA169_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("type")))) {
            	                alt169=1;
            	            }
            	            switch (alt169) {
            	                case 1 :
            	                    // PLSQL_DMLParser.g:808:21: type_key
            	                    {
            	                    pushFollow(FOLLOW_type_key_in_equality_expression7392);
            	                    type_key530=gPLSQLParser.type_key();

            	                    state._fsp--;
            	                    if (state.failed) return retval;
            	                    if ( state.backtracking==0 ) stream_type_key.add(type_key530.getTree());

            	                    }
            	                    break;

            	            }


            	            LEFT_PAREN531=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_equality_expression7395); if (state.failed) return retval; 
            	            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN531);


            	            pushFollow(FOLLOW_type_spec_in_equality_expression7397);
            	            type_spec532=gPLSQLParser.type_spec();

            	            state._fsp--;
            	            if (state.failed) return retval;
            	            if ( state.backtracking==0 ) stream_type_spec.add(type_spec532.getTree());

            	            // PLSQL_DMLParser.g:808:52: ( COMMA type_spec )*
            	            loop170:
            	            do {
            	                int alt170=2;
            	                int LA170_0 = input.LA(1);

            	                if ( (LA170_0==COMMA) ) {
            	                    alt170=1;
            	                }


            	                switch (alt170) {
            	            	case 1 :
            	            	    // PLSQL_DMLParser.g:808:53: COMMA type_spec
            	            	    {
            	            	    COMMA533=(Token)match(input,COMMA,FOLLOW_COMMA_in_equality_expression7400); if (state.failed) return retval; 
            	            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA533);


            	            	    pushFollow(FOLLOW_type_spec_in_equality_expression7402);
            	            	    type_spec534=gPLSQLParser.type_spec();

            	            	    state._fsp--;
            	            	    if (state.failed) return retval;
            	            	    if ( state.backtracking==0 ) stream_type_spec.add(type_spec534.getTree());

            	            	    }
            	            	    break;

            	            	default :
            	            	    break loop170;
            	                }
            	            } while (true);


            	            RIGHT_PAREN535=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_equality_expression7406); if (state.failed) return retval; 
            	            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN535);


            	            // AST REWRITE
            	            // elements: type_spec, equality_expression, type_spec, equality_expression
            	            // token labels: 
            	            // rule labels: retval
            	            // token list labels: 
            	            // rule list labels: 
            	            // wildcard labels: 
            	            if ( state.backtracking==0 ) {

            	            retval.tree = root_0;
            	            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            	            root_0 = (Object)adaptor.nil();
            	            // 809:17: -> {isNegated}? ^( IS_NOT_OF_TYPE $equality_expression ( type_spec )+ )
            	            if (isNegated) {
            	                // PLSQL_DMLParser.g:809:33: ^( IS_NOT_OF_TYPE $equality_expression ( type_spec )+ )
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_NOT_OF_TYPE, "IS_NOT_OF_TYPE")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                if ( !(stream_type_spec.hasNext()) ) {
            	                    throw new RewriteEarlyExitException();
            	                }
            	                while ( stream_type_spec.hasNext() ) {
            	                    adaptor.addChild(root_1, stream_type_spec.nextTree());

            	                }
            	                stream_type_spec.reset();

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }

            	            else // 810:17: -> ^( IS_OF_TYPE $equality_expression ( type_spec )+ )
            	            {
            	                // PLSQL_DMLParser.g:810:20: ^( IS_OF_TYPE $equality_expression ( type_spec )+ )
            	                {
            	                Object root_1 = (Object)adaptor.nil();
            	                root_1 = (Object)adaptor.becomeRoot(
            	                (Object)adaptor.create(IS_OF_TYPE, "IS_OF_TYPE")
            	                , root_1);

            	                adaptor.addChild(root_1, stream_retval.nextTree());

            	                if ( !(stream_type_spec.hasNext()) ) {
            	                    throw new RewriteEarlyExitException();
            	                }
            	                while ( stream_type_spec.hasNext() ) {
            	                    adaptor.addChild(root_1, stream_type_spec.nextTree());

            	                }
            	                stream_type_spec.reset();

            	                adaptor.addChild(root_0, root_1);
            	                }

            	            }


            	            retval.tree = root_0;
            	            }

            	            }
            	            break;

            	    }


            	    }
            	    break;

            	default :
            	    break loop172;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "equality_expression"


    public static class multiset_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "multiset_expression"
    // PLSQL_DMLParser.g:816:1: multiset_expression : ( relational_expression -> relational_expression ) ( multiset_type ( of_key )? concatenation -> ^( multiset_type $multiset_expression ^( EXPR concatenation ) ) )? ;
    public final PLSQLParser_PLSQL_DMLParser.multiset_expression_return multiset_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.multiset_expression_return retval = new PLSQLParser_PLSQL_DMLParser.multiset_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.relational_expression_return relational_expression536 =null;

        PLSQLParser_PLSQL_DMLParser.multiset_type_return multiset_type537 =null;

        PLSQLParser_PLSQLKeys.of_key_return of_key538 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_return concatenation539 =null;


        RewriteRuleSubtreeStream stream_multiset_type=new RewriteRuleSubtreeStream(adaptor,"rule multiset_type");
        RewriteRuleSubtreeStream stream_relational_expression=new RewriteRuleSubtreeStream(adaptor,"rule relational_expression");
        RewriteRuleSubtreeStream stream_of_key=new RewriteRuleSubtreeStream(adaptor,"rule of_key");
        RewriteRuleSubtreeStream stream_concatenation=new RewriteRuleSubtreeStream(adaptor,"rule concatenation");
        try {
            // PLSQL_DMLParser.g:817:5: ( ( relational_expression -> relational_expression ) ( multiset_type ( of_key )? concatenation -> ^( multiset_type $multiset_expression ^( EXPR concatenation ) ) )? )
            // PLSQL_DMLParser.g:817:10: ( relational_expression -> relational_expression ) ( multiset_type ( of_key )? concatenation -> ^( multiset_type $multiset_expression ^( EXPR concatenation ) ) )?
            {
            // PLSQL_DMLParser.g:817:10: ( relational_expression -> relational_expression )
            // PLSQL_DMLParser.g:817:11: relational_expression
            {
            pushFollow(FOLLOW_relational_expression_in_multiset_expression7503);
            relational_expression536=relational_expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_relational_expression.add(relational_expression536.getTree());

            // AST REWRITE
            // elements: relational_expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 817:33: -> relational_expression
            {
                adaptor.addChild(root_0, stream_relational_expression.nextTree());

            }


            retval.tree = root_0;
            }

            }


            // PLSQL_DMLParser.g:818:5: ( multiset_type ( of_key )? concatenation -> ^( multiset_type $multiset_expression ^( EXPR concatenation ) ) )?
            int alt174=2;
            int LA174_0 = input.LA(1);

            if ( (LA174_0==REGULAR_ID) ) {
                int LA174_1 = input.LA(2);

                if ( (((input.LT(1).getText().equalsIgnoreCase("submultiset"))||(input.LT(1).getText().equalsIgnoreCase("member")))) ) {
                    alt174=1;
                }
            }
            switch (alt174) {
                case 1 :
                    // PLSQL_DMLParser.g:818:10: multiset_type ( of_key )? concatenation
                    {
                    pushFollow(FOLLOW_multiset_type_in_multiset_expression7519);
                    multiset_type537=multiset_type();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_multiset_type.add(multiset_type537.getTree());

                    // PLSQL_DMLParser.g:818:24: ( of_key )?
                    int alt173=2;
                    int LA173_0 = input.LA(1);

                    if ( (LA173_0==SQL92_RESERVED_OF) ) {
                        alt173=1;
                    }
                    switch (alt173) {
                        case 1 :
                            // PLSQL_DMLParser.g:818:24: of_key
                            {
                            pushFollow(FOLLOW_of_key_in_multiset_expression7521);
                            of_key538=gPLSQLParser.of_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_of_key.add(of_key538.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_concatenation_in_multiset_expression7524);
                    concatenation539=concatenation();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_concatenation.add(concatenation539.getTree());

                    // AST REWRITE
                    // elements: multiset_expression, multiset_type, concatenation
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 819:9: -> ^( multiset_type $multiset_expression ^( EXPR concatenation ) )
                    {
                        // PLSQL_DMLParser.g:819:12: ^( multiset_type $multiset_expression ^( EXPR concatenation ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(stream_multiset_type.nextNode(), root_1);

                        adaptor.addChild(root_1, stream_retval.nextTree());

                        // PLSQL_DMLParser.g:819:49: ^( EXPR concatenation )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(EXPR, "EXPR")
                        , root_2);

                        adaptor.addChild(root_2, stream_concatenation.nextTree());

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "multiset_expression"


    public static class multiset_type_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "multiset_type"
    // PLSQL_DMLParser.g:822:1: multiset_type : ( member_key | submultiset_key );
    public final PLSQLParser_PLSQL_DMLParser.multiset_type_return multiset_type() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.multiset_type_return retval = new PLSQLParser_PLSQL_DMLParser.multiset_type_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.member_key_return member_key540 =null;

        PLSQLParser_PLSQLKeys.submultiset_key_return submultiset_key541 =null;



        try {
            // PLSQL_DMLParser.g:823:5: ( member_key | submultiset_key )
            int alt175=2;
            int LA175_0 = input.LA(1);

            if ( (LA175_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("submultiset"))||(input.LT(1).getText().equalsIgnoreCase("member"))))) {
                int LA175_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("member"))) ) {
                    alt175=1;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("submultiset"))) ) {
                    alt175=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 175, 1, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 175, 0, input);

                throw nvae;

            }
            switch (alt175) {
                case 1 :
                    // PLSQL_DMLParser.g:823:10: member_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_member_key_in_multiset_type7569);
                    member_key540=gPLSQLParser.member_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, member_key540.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:824:10: submultiset_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_submultiset_key_in_multiset_type7580);
                    submultiset_key541=gPLSQLParser.submultiset_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, submultiset_key541.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "multiset_type"


    public static class relational_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "relational_expression"
    // PLSQL_DMLParser.g:827:1: relational_expression : compound_expression ( ( EQUALS_OP ^| NOT_EQUAL_OP ^| LESS_THAN_OP ^| GREATER_THAN_OP ^| LESS_THAN_OR_EQUALS_OP ^| GREATER_THAN_OR_EQUALS_OP ^) compound_expression )* ;
    public final PLSQLParser_PLSQL_DMLParser.relational_expression_return relational_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.relational_expression_return retval = new PLSQLParser_PLSQL_DMLParser.relational_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token EQUALS_OP543=null;
        Token NOT_EQUAL_OP544=null;
        Token LESS_THAN_OP545=null;
        Token GREATER_THAN_OP546=null;
        Token LESS_THAN_OR_EQUALS_OP547=null;
        Token GREATER_THAN_OR_EQUALS_OP548=null;
        PLSQLParser_PLSQL_DMLParser.compound_expression_return compound_expression542 =null;

        PLSQLParser_PLSQL_DMLParser.compound_expression_return compound_expression549 =null;


        Object EQUALS_OP543_tree=null;
        Object NOT_EQUAL_OP544_tree=null;
        Object LESS_THAN_OP545_tree=null;
        Object GREATER_THAN_OP546_tree=null;
        Object LESS_THAN_OR_EQUALS_OP547_tree=null;
        Object GREATER_THAN_OR_EQUALS_OP548_tree=null;

        try {
            // PLSQL_DMLParser.g:828:5: ( compound_expression ( ( EQUALS_OP ^| NOT_EQUAL_OP ^| LESS_THAN_OP ^| GREATER_THAN_OP ^| LESS_THAN_OR_EQUALS_OP ^| GREATER_THAN_OR_EQUALS_OP ^) compound_expression )* )
            // PLSQL_DMLParser.g:828:10: compound_expression ( ( EQUALS_OP ^| NOT_EQUAL_OP ^| LESS_THAN_OP ^| GREATER_THAN_OP ^| LESS_THAN_OR_EQUALS_OP ^| GREATER_THAN_OR_EQUALS_OP ^) compound_expression )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_compound_expression_in_relational_expression7600);
            compound_expression542=compound_expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, compound_expression542.getTree());

            // PLSQL_DMLParser.g:829:5: ( ( EQUALS_OP ^| NOT_EQUAL_OP ^| LESS_THAN_OP ^| GREATER_THAN_OP ^| LESS_THAN_OR_EQUALS_OP ^| GREATER_THAN_OR_EQUALS_OP ^) compound_expression )*
            loop177:
            do {
                int alt177=2;
                switch ( input.LA(1) ) {
                case EQUALS_OP:
                    {
                    alt177=1;
                    }
                    break;
                case NOT_EQUAL_OP:
                    {
                    alt177=1;
                    }
                    break;
                case LESS_THAN_OP:
                    {
                    alt177=1;
                    }
                    break;
                case GREATER_THAN_OP:
                    {
                    alt177=1;
                    }
                    break;
                case LESS_THAN_OR_EQUALS_OP:
                    {
                    alt177=1;
                    }
                    break;
                case GREATER_THAN_OR_EQUALS_OP:
                    {
                    alt177=1;
                    }
                    break;

                }

                switch (alt177) {
            	case 1 :
            	    // PLSQL_DMLParser.g:829:7: ( EQUALS_OP ^| NOT_EQUAL_OP ^| LESS_THAN_OP ^| GREATER_THAN_OP ^| LESS_THAN_OR_EQUALS_OP ^| GREATER_THAN_OR_EQUALS_OP ^) compound_expression
            	    {
            	    // PLSQL_DMLParser.g:829:7: ( EQUALS_OP ^| NOT_EQUAL_OP ^| LESS_THAN_OP ^| GREATER_THAN_OP ^| LESS_THAN_OR_EQUALS_OP ^| GREATER_THAN_OR_EQUALS_OP ^)
            	    int alt176=6;
            	    switch ( input.LA(1) ) {
            	    case EQUALS_OP:
            	        {
            	        alt176=1;
            	        }
            	        break;
            	    case NOT_EQUAL_OP:
            	        {
            	        alt176=2;
            	        }
            	        break;
            	    case LESS_THAN_OP:
            	        {
            	        alt176=3;
            	        }
            	        break;
            	    case GREATER_THAN_OP:
            	        {
            	        alt176=4;
            	        }
            	        break;
            	    case LESS_THAN_OR_EQUALS_OP:
            	        {
            	        alt176=5;
            	        }
            	        break;
            	    case GREATER_THAN_OR_EQUALS_OP:
            	        {
            	        alt176=6;
            	        }
            	        break;
            	    default:
            	        if (state.backtracking>0) {state.failed=true; return retval;}
            	        NoViableAltException nvae =
            	            new NoViableAltException("", 176, 0, input);

            	        throw nvae;

            	    }

            	    switch (alt176) {
            	        case 1 :
            	            // PLSQL_DMLParser.g:829:9: EQUALS_OP ^
            	            {
            	            EQUALS_OP543=(Token)match(input,EQUALS_OP,FOLLOW_EQUALS_OP_in_relational_expression7610); if (state.failed) return retval;
            	            if ( state.backtracking==0 ) {
            	            EQUALS_OP543_tree = 
            	            (Object)adaptor.create(EQUALS_OP543)
            	            ;
            	            root_0 = (Object)adaptor.becomeRoot(EQUALS_OP543_tree, root_0);
            	            }

            	            }
            	            break;
            	        case 2 :
            	            // PLSQL_DMLParser.g:829:22: NOT_EQUAL_OP ^
            	            {
            	            NOT_EQUAL_OP544=(Token)match(input,NOT_EQUAL_OP,FOLLOW_NOT_EQUAL_OP_in_relational_expression7615); if (state.failed) return retval;
            	            if ( state.backtracking==0 ) {
            	            NOT_EQUAL_OP544_tree = 
            	            (Object)adaptor.create(NOT_EQUAL_OP544)
            	            ;
            	            root_0 = (Object)adaptor.becomeRoot(NOT_EQUAL_OP544_tree, root_0);
            	            }

            	            }
            	            break;
            	        case 3 :
            	            // PLSQL_DMLParser.g:829:38: LESS_THAN_OP ^
            	            {
            	            LESS_THAN_OP545=(Token)match(input,LESS_THAN_OP,FOLLOW_LESS_THAN_OP_in_relational_expression7620); if (state.failed) return retval;
            	            if ( state.backtracking==0 ) {
            	            LESS_THAN_OP545_tree = 
            	            (Object)adaptor.create(LESS_THAN_OP545)
            	            ;
            	            root_0 = (Object)adaptor.becomeRoot(LESS_THAN_OP545_tree, root_0);
            	            }

            	            }
            	            break;
            	        case 4 :
            	            // PLSQL_DMLParser.g:829:54: GREATER_THAN_OP ^
            	            {
            	            GREATER_THAN_OP546=(Token)match(input,GREATER_THAN_OP,FOLLOW_GREATER_THAN_OP_in_relational_expression7625); if (state.failed) return retval;
            	            if ( state.backtracking==0 ) {
            	            GREATER_THAN_OP546_tree = 
            	            (Object)adaptor.create(GREATER_THAN_OP546)
            	            ;
            	            root_0 = (Object)adaptor.becomeRoot(GREATER_THAN_OP546_tree, root_0);
            	            }

            	            }
            	            break;
            	        case 5 :
            	            // PLSQL_DMLParser.g:829:73: LESS_THAN_OR_EQUALS_OP ^
            	            {
            	            LESS_THAN_OR_EQUALS_OP547=(Token)match(input,LESS_THAN_OR_EQUALS_OP,FOLLOW_LESS_THAN_OR_EQUALS_OP_in_relational_expression7630); if (state.failed) return retval;
            	            if ( state.backtracking==0 ) {
            	            LESS_THAN_OR_EQUALS_OP547_tree = 
            	            (Object)adaptor.create(LESS_THAN_OR_EQUALS_OP547)
            	            ;
            	            root_0 = (Object)adaptor.becomeRoot(LESS_THAN_OR_EQUALS_OP547_tree, root_0);
            	            }

            	            }
            	            break;
            	        case 6 :
            	            // PLSQL_DMLParser.g:829:99: GREATER_THAN_OR_EQUALS_OP ^
            	            {
            	            GREATER_THAN_OR_EQUALS_OP548=(Token)match(input,GREATER_THAN_OR_EQUALS_OP,FOLLOW_GREATER_THAN_OR_EQUALS_OP_in_relational_expression7635); if (state.failed) return retval;
            	            if ( state.backtracking==0 ) {
            	            GREATER_THAN_OR_EQUALS_OP548_tree = 
            	            (Object)adaptor.create(GREATER_THAN_OR_EQUALS_OP548)
            	            ;
            	            root_0 = (Object)adaptor.becomeRoot(GREATER_THAN_OR_EQUALS_OP548_tree, root_0);
            	            }

            	            }
            	            break;

            	    }


            	    pushFollow(FOLLOW_compound_expression_in_relational_expression7640);
            	    compound_expression549=compound_expression();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, compound_expression549.getTree());

            	    }
            	    break;

            	default :
            	    break loop177;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "relational_expression"


    public static class compound_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "compound_expression"
    // PLSQL_DMLParser.g:832:1: compound_expression : ( concatenation -> concatenation ) ( ( not_key )? ( in_key in_elements -> {isNegated}? ^( NOT_IN $compound_expression in_elements ) -> ^( in_key $compound_expression in_elements ) | between_key between_elements -> {isNegated}? ^( NOT_BETWEEN $compound_expression between_elements ) -> ^( between_key $compound_expression between_elements ) | like_type concatenation ( like_escape_part )? -> {isNegated}? ^( NOT_LIKE $compound_expression ^( EXPR concatenation ) ( like_escape_part )? ) -> ^( like_type $compound_expression ^( EXPR concatenation ) ( like_escape_part )? ) ) )? ;
    public final PLSQLParser_PLSQL_DMLParser.compound_expression_return compound_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.compound_expression_return retval = new PLSQLParser_PLSQL_DMLParser.compound_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.concatenation_return concatenation550 =null;

        PLSQLParser_PLSQLKeys.not_key_return not_key551 =null;

        PLSQLParser_PLSQLKeys.in_key_return in_key552 =null;

        PLSQLParser_PLSQL_DMLParser.in_elements_return in_elements553 =null;

        PLSQLParser_PLSQLKeys.between_key_return between_key554 =null;

        PLSQLParser_PLSQL_DMLParser.between_elements_return between_elements555 =null;

        PLSQLParser_PLSQL_DMLParser.like_type_return like_type556 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_return concatenation557 =null;

        PLSQLParser_PLSQL_DMLParser.like_escape_part_return like_escape_part558 =null;


        RewriteRuleSubtreeStream stream_between_elements=new RewriteRuleSubtreeStream(adaptor,"rule between_elements");
        RewriteRuleSubtreeStream stream_like_escape_part=new RewriteRuleSubtreeStream(adaptor,"rule like_escape_part");
        RewriteRuleSubtreeStream stream_between_key=new RewriteRuleSubtreeStream(adaptor,"rule between_key");
        RewriteRuleSubtreeStream stream_not_key=new RewriteRuleSubtreeStream(adaptor,"rule not_key");
        RewriteRuleSubtreeStream stream_like_type=new RewriteRuleSubtreeStream(adaptor,"rule like_type");
        RewriteRuleSubtreeStream stream_concatenation=new RewriteRuleSubtreeStream(adaptor,"rule concatenation");
        RewriteRuleSubtreeStream stream_in_key=new RewriteRuleSubtreeStream(adaptor,"rule in_key");
        RewriteRuleSubtreeStream stream_in_elements=new RewriteRuleSubtreeStream(adaptor,"rule in_elements");
            boolean isNegated = false;    
        try {
            // PLSQL_DMLParser.g:834:5: ( ( concatenation -> concatenation ) ( ( not_key )? ( in_key in_elements -> {isNegated}? ^( NOT_IN $compound_expression in_elements ) -> ^( in_key $compound_expression in_elements ) | between_key between_elements -> {isNegated}? ^( NOT_BETWEEN $compound_expression between_elements ) -> ^( between_key $compound_expression between_elements ) | like_type concatenation ( like_escape_part )? -> {isNegated}? ^( NOT_LIKE $compound_expression ^( EXPR concatenation ) ( like_escape_part )? ) -> ^( like_type $compound_expression ^( EXPR concatenation ) ( like_escape_part )? ) ) )? )
            // PLSQL_DMLParser.g:834:10: ( concatenation -> concatenation ) ( ( not_key )? ( in_key in_elements -> {isNegated}? ^( NOT_IN $compound_expression in_elements ) -> ^( in_key $compound_expression in_elements ) | between_key between_elements -> {isNegated}? ^( NOT_BETWEEN $compound_expression between_elements ) -> ^( between_key $compound_expression between_elements ) | like_type concatenation ( like_escape_part )? -> {isNegated}? ^( NOT_LIKE $compound_expression ^( EXPR concatenation ) ( like_escape_part )? ) -> ^( like_type $compound_expression ^( EXPR concatenation ) ( like_escape_part )? ) ) )?
            {
            // PLSQL_DMLParser.g:834:10: ( concatenation -> concatenation )
            // PLSQL_DMLParser.g:834:11: concatenation
            {
            pushFollow(FOLLOW_concatenation_in_compound_expression7671);
            concatenation550=concatenation();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_concatenation.add(concatenation550.getTree());

            // AST REWRITE
            // elements: concatenation
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 834:25: -> concatenation
            {
                adaptor.addChild(root_0, stream_concatenation.nextTree());

            }


            retval.tree = root_0;
            }

            }


            // PLSQL_DMLParser.g:835:5: ( ( not_key )? ( in_key in_elements -> {isNegated}? ^( NOT_IN $compound_expression in_elements ) -> ^( in_key $compound_expression in_elements ) | between_key between_elements -> {isNegated}? ^( NOT_BETWEEN $compound_expression between_elements ) -> ^( between_key $compound_expression between_elements ) | like_type concatenation ( like_escape_part )? -> {isNegated}? ^( NOT_LIKE $compound_expression ^( EXPR concatenation ) ( like_escape_part )? ) -> ^( like_type $compound_expression ^( EXPR concatenation ) ( like_escape_part )? ) ) )?
            int alt181=2;
            switch ( input.LA(1) ) {
                case SQL92_RESERVED_NOT:
                    {
                    alt181=1;
                    }
                    break;
                case SQL92_RESERVED_IN:
                    {
                    alt181=1;
                    }
                    break;
                case SQL92_RESERVED_BETWEEN:
                    {
                    alt181=1;
                    }
                    break;
                case SQL92_RESERVED_LIKE:
                    {
                    alt181=1;
                    }
                    break;
                case REGULAR_ID:
                    {
                    int LA181_5 = input.LA(2);

                    if ( (((input.LT(1).getText().equalsIgnoreCase("like4"))||(input.LT(1).getText().equalsIgnoreCase("like2"))||(input.LT(1).getText().equalsIgnoreCase("likec")))) ) {
                        alt181=1;
                    }
                    }
                    break;
            }

            switch (alt181) {
                case 1 :
                    // PLSQL_DMLParser.g:835:10: ( not_key )? ( in_key in_elements -> {isNegated}? ^( NOT_IN $compound_expression in_elements ) -> ^( in_key $compound_expression in_elements ) | between_key between_elements -> {isNegated}? ^( NOT_BETWEEN $compound_expression between_elements ) -> ^( between_key $compound_expression between_elements ) | like_type concatenation ( like_escape_part )? -> {isNegated}? ^( NOT_LIKE $compound_expression ^( EXPR concatenation ) ( like_escape_part )? ) -> ^( like_type $compound_expression ^( EXPR concatenation ) ( like_escape_part )? ) )
                    {
                    // PLSQL_DMLParser.g:835:10: ( not_key )?
                    int alt178=2;
                    int LA178_0 = input.LA(1);

                    if ( (LA178_0==SQL92_RESERVED_NOT) ) {
                        alt178=1;
                    }
                    switch (alt178) {
                        case 1 :
                            // PLSQL_DMLParser.g:835:11: not_key
                            {
                            pushFollow(FOLLOW_not_key_in_compound_expression7688);
                            not_key551=gPLSQLParser.not_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_not_key.add(not_key551.getTree());

                            if ( state.backtracking==0 ) {isNegated = true;}

                            }
                            break;

                    }


                    // PLSQL_DMLParser.g:836:9: ( in_key in_elements -> {isNegated}? ^( NOT_IN $compound_expression in_elements ) -> ^( in_key $compound_expression in_elements ) | between_key between_elements -> {isNegated}? ^( NOT_BETWEEN $compound_expression between_elements ) -> ^( between_key $compound_expression between_elements ) | like_type concatenation ( like_escape_part )? -> {isNegated}? ^( NOT_LIKE $compound_expression ^( EXPR concatenation ) ( like_escape_part )? ) -> ^( like_type $compound_expression ^( EXPR concatenation ) ( like_escape_part )? ) )
                    int alt180=3;
                    int LA180_0 = input.LA(1);

                    if ( (LA180_0==SQL92_RESERVED_IN) ) {
                        alt180=1;
                    }
                    else if ( (LA180_0==SQL92_RESERVED_BETWEEN) ) {
                        alt180=2;
                    }
                    else if ( (LA180_0==SQL92_RESERVED_LIKE) ) {
                        alt180=3;
                    }
                    else if ( (LA180_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("like4"))||(input.LT(1).getText().equalsIgnoreCase("like2"))||(input.LT(1).getText().equalsIgnoreCase("likec"))))) {
                        alt180=3;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 180, 0, input);

                        throw nvae;

                    }
                    switch (alt180) {
                        case 1 :
                            // PLSQL_DMLParser.g:836:14: in_key in_elements
                            {
                            pushFollow(FOLLOW_in_key_in_compound_expression7708);
                            in_key552=gPLSQLParser.in_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_in_key.add(in_key552.getTree());

                            pushFollow(FOLLOW_in_elements_in_compound_expression7710);
                            in_elements553=in_elements();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_in_elements.add(in_elements553.getTree());

                            // AST REWRITE
                            // elements: in_elements, in_key, in_elements, compound_expression, compound_expression
                            // token labels: 
                            // rule labels: retval
                            // token list labels: 
                            // rule list labels: 
                            // wildcard labels: 
                            if ( state.backtracking==0 ) {

                            retval.tree = root_0;
                            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                            root_0 = (Object)adaptor.nil();
                            // 837:17: -> {isNegated}? ^( NOT_IN $compound_expression in_elements )
                            if (isNegated) {
                                // PLSQL_DMLParser.g:837:33: ^( NOT_IN $compound_expression in_elements )
                                {
                                Object root_1 = (Object)adaptor.nil();
                                root_1 = (Object)adaptor.becomeRoot(
                                (Object)adaptor.create(NOT_IN, "NOT_IN")
                                , root_1);

                                adaptor.addChild(root_1, stream_retval.nextTree());

                                adaptor.addChild(root_1, stream_in_elements.nextTree());

                                adaptor.addChild(root_0, root_1);
                                }

                            }

                            else // 838:17: -> ^( in_key $compound_expression in_elements )
                            {
                                // PLSQL_DMLParser.g:838:20: ^( in_key $compound_expression in_elements )
                                {
                                Object root_1 = (Object)adaptor.nil();
                                root_1 = (Object)adaptor.becomeRoot(stream_in_key.nextNode(), root_1);

                                adaptor.addChild(root_1, stream_retval.nextTree());

                                adaptor.addChild(root_1, stream_in_elements.nextTree());

                                adaptor.addChild(root_0, root_1);
                                }

                            }


                            retval.tree = root_0;
                            }

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:839:14: between_key between_elements
                            {
                            pushFollow(FOLLOW_between_key_in_compound_expression7781);
                            between_key554=gPLSQLParser.between_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_between_key.add(between_key554.getTree());

                            pushFollow(FOLLOW_between_elements_in_compound_expression7783);
                            between_elements555=between_elements();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_between_elements.add(between_elements555.getTree());

                            // AST REWRITE
                            // elements: between_elements, compound_expression, between_key, between_elements, compound_expression
                            // token labels: 
                            // rule labels: retval
                            // token list labels: 
                            // rule list labels: 
                            // wildcard labels: 
                            if ( state.backtracking==0 ) {

                            retval.tree = root_0;
                            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                            root_0 = (Object)adaptor.nil();
                            // 840:17: -> {isNegated}? ^( NOT_BETWEEN $compound_expression between_elements )
                            if (isNegated) {
                                // PLSQL_DMLParser.g:840:33: ^( NOT_BETWEEN $compound_expression between_elements )
                                {
                                Object root_1 = (Object)adaptor.nil();
                                root_1 = (Object)adaptor.becomeRoot(
                                (Object)adaptor.create(NOT_BETWEEN, "NOT_BETWEEN")
                                , root_1);

                                adaptor.addChild(root_1, stream_retval.nextTree());

                                adaptor.addChild(root_1, stream_between_elements.nextTree());

                                adaptor.addChild(root_0, root_1);
                                }

                            }

                            else // 841:17: -> ^( between_key $compound_expression between_elements )
                            {
                                // PLSQL_DMLParser.g:841:20: ^( between_key $compound_expression between_elements )
                                {
                                Object root_1 = (Object)adaptor.nil();
                                root_1 = (Object)adaptor.becomeRoot(stream_between_key.nextNode(), root_1);

                                adaptor.addChild(root_1, stream_retval.nextTree());

                                adaptor.addChild(root_1, stream_between_elements.nextTree());

                                adaptor.addChild(root_0, root_1);
                                }

                            }


                            retval.tree = root_0;
                            }

                            }
                            break;
                        case 3 :
                            // PLSQL_DMLParser.g:842:14: like_type concatenation ( like_escape_part )?
                            {
                            pushFollow(FOLLOW_like_type_in_compound_expression7854);
                            like_type556=like_type();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_like_type.add(like_type556.getTree());

                            pushFollow(FOLLOW_concatenation_in_compound_expression7856);
                            concatenation557=concatenation();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_concatenation.add(concatenation557.getTree());

                            // PLSQL_DMLParser.g:842:38: ( like_escape_part )?
                            int alt179=2;
                            int LA179_0 = input.LA(1);

                            if ( (LA179_0==REGULAR_ID) ) {
                                int LA179_1 = input.LA(2);

                                if ( ((input.LT(1).getText().equalsIgnoreCase("escape"))) ) {
                                    alt179=1;
                                }
                            }
                            switch (alt179) {
                                case 1 :
                                    // PLSQL_DMLParser.g:842:38: like_escape_part
                                    {
                                    pushFollow(FOLLOW_like_escape_part_in_compound_expression7858);
                                    like_escape_part558=like_escape_part();

                                    state._fsp--;
                                    if (state.failed) return retval;
                                    if ( state.backtracking==0 ) stream_like_escape_part.add(like_escape_part558.getTree());

                                    }
                                    break;

                            }


                            // AST REWRITE
                            // elements: concatenation, concatenation, like_type, like_escape_part, like_escape_part, compound_expression, compound_expression
                            // token labels: 
                            // rule labels: retval
                            // token list labels: 
                            // rule list labels: 
                            // wildcard labels: 
                            if ( state.backtracking==0 ) {

                            retval.tree = root_0;
                            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                            root_0 = (Object)adaptor.nil();
                            // 843:17: -> {isNegated}? ^( NOT_LIKE $compound_expression ^( EXPR concatenation ) ( like_escape_part )? )
                            if (isNegated) {
                                // PLSQL_DMLParser.g:843:33: ^( NOT_LIKE $compound_expression ^( EXPR concatenation ) ( like_escape_part )? )
                                {
                                Object root_1 = (Object)adaptor.nil();
                                root_1 = (Object)adaptor.becomeRoot(
                                (Object)adaptor.create(NOT_LIKE, "NOT_LIKE")
                                , root_1);

                                adaptor.addChild(root_1, stream_retval.nextTree());

                                // PLSQL_DMLParser.g:843:65: ^( EXPR concatenation )
                                {
                                Object root_2 = (Object)adaptor.nil();
                                root_2 = (Object)adaptor.becomeRoot(
                                (Object)adaptor.create(EXPR, "EXPR")
                                , root_2);

                                adaptor.addChild(root_2, stream_concatenation.nextTree());

                                adaptor.addChild(root_1, root_2);
                                }

                                // PLSQL_DMLParser.g:843:87: ( like_escape_part )?
                                if ( stream_like_escape_part.hasNext() ) {
                                    adaptor.addChild(root_1, stream_like_escape_part.nextTree());

                                }
                                stream_like_escape_part.reset();

                                adaptor.addChild(root_0, root_1);
                                }

                            }

                            else // 844:17: -> ^( like_type $compound_expression ^( EXPR concatenation ) ( like_escape_part )? )
                            {
                                // PLSQL_DMLParser.g:844:20: ^( like_type $compound_expression ^( EXPR concatenation ) ( like_escape_part )? )
                                {
                                Object root_1 = (Object)adaptor.nil();
                                root_1 = (Object)adaptor.becomeRoot(stream_like_type.nextNode(), root_1);

                                adaptor.addChild(root_1, stream_retval.nextTree());

                                // PLSQL_DMLParser.g:844:54: ^( EXPR concatenation )
                                {
                                Object root_2 = (Object)adaptor.nil();
                                root_2 = (Object)adaptor.becomeRoot(
                                (Object)adaptor.create(EXPR, "EXPR")
                                , root_2);

                                adaptor.addChild(root_2, stream_concatenation.nextTree());

                                adaptor.addChild(root_1, root_2);
                                }

                                // PLSQL_DMLParser.g:844:76: ( like_escape_part )?
                                if ( stream_like_escape_part.hasNext() ) {
                                    adaptor.addChild(root_1, stream_like_escape_part.nextTree());

                                }
                                stream_like_escape_part.reset();

                                adaptor.addChild(root_0, root_1);
                                }

                            }


                            retval.tree = root_0;
                            }

                            }
                            break;

                    }


                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "compound_expression"


    public static class like_type_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "like_type"
    // PLSQL_DMLParser.g:849:1: like_type : ( like_key | likec_key | like2_key | like4_key );
    public final PLSQLParser_PLSQL_DMLParser.like_type_return like_type() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.like_type_return retval = new PLSQLParser_PLSQL_DMLParser.like_type_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.like_key_return like_key559 =null;

        PLSQLParser_PLSQLKeys.likec_key_return likec_key560 =null;

        PLSQLParser_PLSQLKeys.like2_key_return like2_key561 =null;

        PLSQLParser_PLSQLKeys.like4_key_return like4_key562 =null;



        try {
            // PLSQL_DMLParser.g:850:5: ( like_key | likec_key | like2_key | like4_key )
            int alt182=4;
            int LA182_0 = input.LA(1);

            if ( (LA182_0==SQL92_RESERVED_LIKE) ) {
                alt182=1;
            }
            else if ( (LA182_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("like4"))||(input.LT(1).getText().equalsIgnoreCase("like2"))||(input.LT(1).getText().equalsIgnoreCase("likec"))))) {
                int LA182_2 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("likec"))) ) {
                    alt182=2;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("like2"))) ) {
                    alt182=3;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("like4"))) ) {
                    alt182=4;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 182, 2, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 182, 0, input);

                throw nvae;

            }
            switch (alt182) {
                case 1 :
                    // PLSQL_DMLParser.g:850:10: like_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_like_key_in_like_type7967);
                    like_key559=gPLSQLParser.like_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, like_key559.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:851:10: likec_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_likec_key_in_like_type7978);
                    likec_key560=gPLSQLParser.likec_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, likec_key560.getTree());

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:852:10: like2_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_like2_key_in_like_type7989);
                    like2_key561=gPLSQLParser.like2_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, like2_key561.getTree());

                    }
                    break;
                case 4 :
                    // PLSQL_DMLParser.g:853:10: like4_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_like4_key_in_like_type8000);
                    like4_key562=gPLSQLParser.like4_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, like4_key562.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "like_type"


    public static class like_escape_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "like_escape_part"
    // PLSQL_DMLParser.g:856:1: like_escape_part : escape_key concatenation -> ^( EXPR concatenation ) ;
    public final PLSQLParser_PLSQL_DMLParser.like_escape_part_return like_escape_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.like_escape_part_return retval = new PLSQLParser_PLSQL_DMLParser.like_escape_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.escape_key_return escape_key563 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_return concatenation564 =null;


        RewriteRuleSubtreeStream stream_escape_key=new RewriteRuleSubtreeStream(adaptor,"rule escape_key");
        RewriteRuleSubtreeStream stream_concatenation=new RewriteRuleSubtreeStream(adaptor,"rule concatenation");
        try {
            // PLSQL_DMLParser.g:857:5: ( escape_key concatenation -> ^( EXPR concatenation ) )
            // PLSQL_DMLParser.g:857:10: escape_key concatenation
            {
            pushFollow(FOLLOW_escape_key_in_like_escape_part8020);
            escape_key563=gPLSQLParser.escape_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_escape_key.add(escape_key563.getTree());

            pushFollow(FOLLOW_concatenation_in_like_escape_part8022);
            concatenation564=concatenation();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_concatenation.add(concatenation564.getTree());

            // AST REWRITE
            // elements: concatenation
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 858:9: -> ^( EXPR concatenation )
            {
                // PLSQL_DMLParser.g:858:12: ^( EXPR concatenation )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_1);

                adaptor.addChild(root_1, stream_concatenation.nextTree());

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "like_escape_part"


    public static class in_elements_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "in_elements"
    // PLSQL_DMLParser.g:861:1: in_elements : LEFT_PAREN ( ( select_key )=> subquery | concatenation_wrapper ( COMMA concatenation_wrapper )* ) RIGHT_PAREN -> {mode == 1}? subquery -> ^( EXPR_LIST ( concatenation_wrapper )+ ) ;
    public final PLSQLParser_PLSQL_DMLParser.in_elements_return in_elements() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.in_elements_return retval = new PLSQLParser_PLSQL_DMLParser.in_elements_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN565=null;
        Token COMMA568=null;
        Token RIGHT_PAREN570=null;
        PLSQLParser_PLSQL_DMLParser.subquery_return subquery566 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper567 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper569 =null;


        Object LEFT_PAREN565_tree=null;
        Object COMMA568_tree=null;
        Object RIGHT_PAREN570_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_concatenation_wrapper=new RewriteRuleSubtreeStream(adaptor,"rule concatenation_wrapper");
        RewriteRuleSubtreeStream stream_subquery=new RewriteRuleSubtreeStream(adaptor,"rule subquery");
            int mode = 0;    
        try {
            // PLSQL_DMLParser.g:863:5: ( LEFT_PAREN ( ( select_key )=> subquery | concatenation_wrapper ( COMMA concatenation_wrapper )* ) RIGHT_PAREN -> {mode == 1}? subquery -> ^( EXPR_LIST ( concatenation_wrapper )+ ) )
            // PLSQL_DMLParser.g:863:10: LEFT_PAREN ( ( select_key )=> subquery | concatenation_wrapper ( COMMA concatenation_wrapper )* ) RIGHT_PAREN
            {
            LEFT_PAREN565=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_in_elements8066); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN565);


            // PLSQL_DMLParser.g:863:21: ( ( select_key )=> subquery | concatenation_wrapper ( COMMA concatenation_wrapper )* )
            int alt184=2;
            int LA184_0 = input.LA(1);

            if ( (LA184_0==SQL92_RESERVED_SELECT) && (synpred15_PLSQL_DMLParser())) {
                alt184=1;
            }
            else if ( (LA184_0==LEFT_PAREN) ) {
                int LA184_2 = input.LA(2);

                if ( (synpred15_PLSQL_DMLParser()) ) {
                    alt184=1;
                }
                else if ( (true) ) {
                    alt184=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 184, 2, input);

                    throw nvae;

                }
            }
            else if ( (LA184_0==APPROXIMATE_NUM_LIT||(LA184_0 >= CHAR_STRING && LA184_0 <= COLON)||LA184_0==DELIMITED_ID||LA184_0==EXACT_NUM_LIT||LA184_0==INTRODUCER||LA184_0==MINUS_SIGN||LA184_0==PLUS_SIGN||LA184_0==REGULAR_ID||LA184_0==SQL92_RESERVED_ALL||LA184_0==SQL92_RESERVED_ANY||LA184_0==SQL92_RESERVED_CASE||LA184_0==SQL92_RESERVED_DEFAULT||LA184_0==SQL92_RESERVED_DISTINCT||(LA184_0 >= SQL92_RESERVED_EXISTS && LA184_0 <= SQL92_RESERVED_FALSE)||LA184_0==SQL92_RESERVED_NULL||LA184_0==SQL92_RESERVED_PRIOR||LA184_0==SQL92_RESERVED_TRUE||LA184_0==UNSIGNED_INTEGER) ) {
                alt184=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 184, 0, input);

                throw nvae;

            }
            switch (alt184) {
                case 1 :
                    // PLSQL_DMLParser.g:863:22: ( select_key )=> subquery
                    {
                    pushFollow(FOLLOW_subquery_in_in_elements8074);
                    subquery566=subquery();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_subquery.add(subquery566.getTree());

                    if ( state.backtracking==0 ) {mode = 1;}

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:863:60: concatenation_wrapper ( COMMA concatenation_wrapper )*
                    {
                    pushFollow(FOLLOW_concatenation_wrapper_in_in_elements8080);
                    concatenation_wrapper567=concatenation_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_concatenation_wrapper.add(concatenation_wrapper567.getTree());

                    // PLSQL_DMLParser.g:863:82: ( COMMA concatenation_wrapper )*
                    loop183:
                    do {
                        int alt183=2;
                        int LA183_0 = input.LA(1);

                        if ( (LA183_0==COMMA) ) {
                            alt183=1;
                        }


                        switch (alt183) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:863:83: COMMA concatenation_wrapper
                    	    {
                    	    COMMA568=(Token)match(input,COMMA,FOLLOW_COMMA_in_in_elements8083); if (state.failed) return retval; 
                    	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA568);


                    	    pushFollow(FOLLOW_concatenation_wrapper_in_in_elements8085);
                    	    concatenation_wrapper569=concatenation_wrapper();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_concatenation_wrapper.add(concatenation_wrapper569.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop183;
                        }
                    } while (true);


                    }
                    break;

            }


            RIGHT_PAREN570=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_in_elements8091); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN570);


            // AST REWRITE
            // elements: subquery, concatenation_wrapper
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 864:9: -> {mode == 1}? subquery
            if (mode == 1) {
                adaptor.addChild(root_0, stream_subquery.nextTree());

            }

            else // 865:9: -> ^( EXPR_LIST ( concatenation_wrapper )+ )
            {
                // PLSQL_DMLParser.g:865:12: ^( EXPR_LIST ( concatenation_wrapper )+ )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR_LIST, "EXPR_LIST")
                , root_1);

                if ( !(stream_concatenation_wrapper.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_concatenation_wrapper.hasNext() ) {
                    adaptor.addChild(root_1, stream_concatenation_wrapper.nextTree());

                }
                stream_concatenation_wrapper.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "in_elements"


    public static class between_elements_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "between_elements"
    // PLSQL_DMLParser.g:868:1: between_elements : cn1= concatenation and_key cn2= concatenation -> ^( EXPR $cn1) ^( EXPR $cn2) ;
    public final PLSQLParser_PLSQL_DMLParser.between_elements_return between_elements() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.between_elements_return retval = new PLSQLParser_PLSQL_DMLParser.between_elements_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.concatenation_return cn1 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_return cn2 =null;

        PLSQLParser_PLSQLKeys.and_key_return and_key571 =null;


        RewriteRuleSubtreeStream stream_and_key=new RewriteRuleSubtreeStream(adaptor,"rule and_key");
        RewriteRuleSubtreeStream stream_concatenation=new RewriteRuleSubtreeStream(adaptor,"rule concatenation");
        try {
            // PLSQL_DMLParser.g:869:5: (cn1= concatenation and_key cn2= concatenation -> ^( EXPR $cn1) ^( EXPR $cn2) )
            // PLSQL_DMLParser.g:869:10: cn1= concatenation and_key cn2= concatenation
            {
            pushFollow(FOLLOW_concatenation_in_between_elements8144);
            cn1=concatenation();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_concatenation.add(cn1.getTree());

            pushFollow(FOLLOW_and_key_in_between_elements8146);
            and_key571=gPLSQLParser.and_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_and_key.add(and_key571.getTree());

            pushFollow(FOLLOW_concatenation_in_between_elements8150);
            cn2=concatenation();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_concatenation.add(cn2.getTree());

            // AST REWRITE
            // elements: cn1, cn2
            // token labels: 
            // rule labels: retval, cn2, cn1
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
            RewriteRuleSubtreeStream stream_cn2=new RewriteRuleSubtreeStream(adaptor,"rule cn2",cn2!=null?cn2.tree:null);
            RewriteRuleSubtreeStream stream_cn1=new RewriteRuleSubtreeStream(adaptor,"rule cn1",cn1!=null?cn1.tree:null);

            root_0 = (Object)adaptor.nil();
            // 870:9: -> ^( EXPR $cn1) ^( EXPR $cn2)
            {
                // PLSQL_DMLParser.g:870:12: ^( EXPR $cn1)
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_1);

                adaptor.addChild(root_1, stream_cn1.nextTree());

                adaptor.addChild(root_0, root_1);
                }

                // PLSQL_DMLParser.g:870:25: ^( EXPR $cn2)
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_1);

                adaptor.addChild(root_1, stream_cn2.nextTree());

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "between_elements"


    public static class concatenation_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "concatenation"
    // PLSQL_DMLParser.g:873:1: concatenation : additive_expression ( CONCATENATION_OP ^ additive_expression )* ;
    public final PLSQLParser_PLSQL_DMLParser.concatenation_return concatenation() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.concatenation_return retval = new PLSQLParser_PLSQL_DMLParser.concatenation_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token CONCATENATION_OP573=null;
        PLSQLParser_PLSQL_DMLParser.additive_expression_return additive_expression572 =null;

        PLSQLParser_PLSQL_DMLParser.additive_expression_return additive_expression574 =null;


        Object CONCATENATION_OP573_tree=null;

        try {
            // PLSQL_DMLParser.g:874:5: ( additive_expression ( CONCATENATION_OP ^ additive_expression )* )
            // PLSQL_DMLParser.g:874:10: additive_expression ( CONCATENATION_OP ^ additive_expression )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_additive_expression_in_concatenation8195);
            additive_expression572=additive_expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, additive_expression572.getTree());

            // PLSQL_DMLParser.g:874:30: ( CONCATENATION_OP ^ additive_expression )*
            loop185:
            do {
                int alt185=2;
                int LA185_0 = input.LA(1);

                if ( (LA185_0==CONCATENATION_OP) ) {
                    alt185=1;
                }


                switch (alt185) {
            	case 1 :
            	    // PLSQL_DMLParser.g:874:31: CONCATENATION_OP ^ additive_expression
            	    {
            	    CONCATENATION_OP573=(Token)match(input,CONCATENATION_OP,FOLLOW_CONCATENATION_OP_in_concatenation8198); if (state.failed) return retval;
            	    if ( state.backtracking==0 ) {
            	    CONCATENATION_OP573_tree = 
            	    (Object)adaptor.create(CONCATENATION_OP573)
            	    ;
            	    root_0 = (Object)adaptor.becomeRoot(CONCATENATION_OP573_tree, root_0);
            	    }

            	    pushFollow(FOLLOW_additive_expression_in_concatenation8201);
            	    additive_expression574=additive_expression();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, additive_expression574.getTree());

            	    }
            	    break;

            	default :
            	    break loop185;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "concatenation"


    public static class concatenation_wrapper_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "concatenation_wrapper"
    // PLSQL_DMLParser.g:877:1: concatenation_wrapper : concatenation -> ^( EXPR concatenation ) ;
    public final PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return retval = new PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.concatenation_return concatenation575 =null;


        RewriteRuleSubtreeStream stream_concatenation=new RewriteRuleSubtreeStream(adaptor,"rule concatenation");
        try {
            // PLSQL_DMLParser.g:878:5: ( concatenation -> ^( EXPR concatenation ) )
            // PLSQL_DMLParser.g:878:10: concatenation
            {
            pushFollow(FOLLOW_concatenation_in_concatenation_wrapper8223);
            concatenation575=concatenation();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_concatenation.add(concatenation575.getTree());

            // AST REWRITE
            // elements: concatenation
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 879:9: -> ^( EXPR concatenation )
            {
                // PLSQL_DMLParser.g:879:12: ^( EXPR concatenation )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_1);

                adaptor.addChild(root_1, stream_concatenation.nextTree());

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "concatenation_wrapper"


    public static class additive_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "additive_expression"
    // PLSQL_DMLParser.g:882:1: additive_expression : multiply_expression ( ( PLUS_SIGN ^| MINUS_SIGN ^) multiply_expression )* ;
    public final PLSQLParser_PLSQL_DMLParser.additive_expression_return additive_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.additive_expression_return retval = new PLSQLParser_PLSQL_DMLParser.additive_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token PLUS_SIGN577=null;
        Token MINUS_SIGN578=null;
        PLSQLParser_PLSQL_DMLParser.multiply_expression_return multiply_expression576 =null;

        PLSQLParser_PLSQL_DMLParser.multiply_expression_return multiply_expression579 =null;


        Object PLUS_SIGN577_tree=null;
        Object MINUS_SIGN578_tree=null;

        try {
            // PLSQL_DMLParser.g:883:5: ( multiply_expression ( ( PLUS_SIGN ^| MINUS_SIGN ^) multiply_expression )* )
            // PLSQL_DMLParser.g:883:10: multiply_expression ( ( PLUS_SIGN ^| MINUS_SIGN ^) multiply_expression )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_multiply_expression_in_additive_expression8259);
            multiply_expression576=multiply_expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, multiply_expression576.getTree());

            // PLSQL_DMLParser.g:883:30: ( ( PLUS_SIGN ^| MINUS_SIGN ^) multiply_expression )*
            loop187:
            do {
                int alt187=2;
                int LA187_0 = input.LA(1);

                if ( (LA187_0==PLUS_SIGN) ) {
                    alt187=1;
                }
                else if ( (LA187_0==MINUS_SIGN) ) {
                    alt187=1;
                }


                switch (alt187) {
            	case 1 :
            	    // PLSQL_DMLParser.g:883:32: ( PLUS_SIGN ^| MINUS_SIGN ^) multiply_expression
            	    {
            	    // PLSQL_DMLParser.g:883:32: ( PLUS_SIGN ^| MINUS_SIGN ^)
            	    int alt186=2;
            	    int LA186_0 = input.LA(1);

            	    if ( (LA186_0==PLUS_SIGN) ) {
            	        alt186=1;
            	    }
            	    else if ( (LA186_0==MINUS_SIGN) ) {
            	        alt186=2;
            	    }
            	    else {
            	        if (state.backtracking>0) {state.failed=true; return retval;}
            	        NoViableAltException nvae =
            	            new NoViableAltException("", 186, 0, input);

            	        throw nvae;

            	    }
            	    switch (alt186) {
            	        case 1 :
            	            // PLSQL_DMLParser.g:883:34: PLUS_SIGN ^
            	            {
            	            PLUS_SIGN577=(Token)match(input,PLUS_SIGN,FOLLOW_PLUS_SIGN_in_additive_expression8265); if (state.failed) return retval;
            	            if ( state.backtracking==0 ) {
            	            PLUS_SIGN577_tree = 
            	            (Object)adaptor.create(PLUS_SIGN577)
            	            ;
            	            root_0 = (Object)adaptor.becomeRoot(PLUS_SIGN577_tree, root_0);
            	            }

            	            }
            	            break;
            	        case 2 :
            	            // PLSQL_DMLParser.g:883:47: MINUS_SIGN ^
            	            {
            	            MINUS_SIGN578=(Token)match(input,MINUS_SIGN,FOLLOW_MINUS_SIGN_in_additive_expression8270); if (state.failed) return retval;
            	            if ( state.backtracking==0 ) {
            	            MINUS_SIGN578_tree = 
            	            (Object)adaptor.create(MINUS_SIGN578)
            	            ;
            	            root_0 = (Object)adaptor.becomeRoot(MINUS_SIGN578_tree, root_0);
            	            }

            	            }
            	            break;

            	    }


            	    pushFollow(FOLLOW_multiply_expression_in_additive_expression8275);
            	    multiply_expression579=multiply_expression();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, multiply_expression579.getTree());

            	    }
            	    break;

            	default :
            	    break loop187;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "additive_expression"


    public static class multiply_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "multiply_expression"
    // PLSQL_DMLParser.g:886:1: multiply_expression : datetime_expression ( ( ASTERISK ^| SOLIDUS ^) datetime_expression )* ;
    public final PLSQLParser_PLSQL_DMLParser.multiply_expression_return multiply_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.multiply_expression_return retval = new PLSQLParser_PLSQL_DMLParser.multiply_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token ASTERISK581=null;
        Token SOLIDUS582=null;
        PLSQLParser_PLSQL_DMLParser.datetime_expression_return datetime_expression580 =null;

        PLSQLParser_PLSQL_DMLParser.datetime_expression_return datetime_expression583 =null;


        Object ASTERISK581_tree=null;
        Object SOLIDUS582_tree=null;

        try {
            // PLSQL_DMLParser.g:887:5: ( datetime_expression ( ( ASTERISK ^| SOLIDUS ^) datetime_expression )* )
            // PLSQL_DMLParser.g:887:10: datetime_expression ( ( ASTERISK ^| SOLIDUS ^) datetime_expression )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_datetime_expression_in_multiply_expression8297);
            datetime_expression580=datetime_expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, datetime_expression580.getTree());

            // PLSQL_DMLParser.g:887:30: ( ( ASTERISK ^| SOLIDUS ^) datetime_expression )*
            loop189:
            do {
                int alt189=2;
                int LA189_0 = input.LA(1);

                if ( (LA189_0==ASTERISK) ) {
                    alt189=1;
                }
                else if ( (LA189_0==SOLIDUS) ) {
                    alt189=1;
                }


                switch (alt189) {
            	case 1 :
            	    // PLSQL_DMLParser.g:887:32: ( ASTERISK ^| SOLIDUS ^) datetime_expression
            	    {
            	    // PLSQL_DMLParser.g:887:32: ( ASTERISK ^| SOLIDUS ^)
            	    int alt188=2;
            	    int LA188_0 = input.LA(1);

            	    if ( (LA188_0==ASTERISK) ) {
            	        alt188=1;
            	    }
            	    else if ( (LA188_0==SOLIDUS) ) {
            	        alt188=2;
            	    }
            	    else {
            	        if (state.backtracking>0) {state.failed=true; return retval;}
            	        NoViableAltException nvae =
            	            new NoViableAltException("", 188, 0, input);

            	        throw nvae;

            	    }
            	    switch (alt188) {
            	        case 1 :
            	            // PLSQL_DMLParser.g:887:34: ASTERISK ^
            	            {
            	            ASTERISK581=(Token)match(input,ASTERISK,FOLLOW_ASTERISK_in_multiply_expression8303); if (state.failed) return retval;
            	            if ( state.backtracking==0 ) {
            	            ASTERISK581_tree = 
            	            (Object)adaptor.create(ASTERISK581)
            	            ;
            	            root_0 = (Object)adaptor.becomeRoot(ASTERISK581_tree, root_0);
            	            }

            	            }
            	            break;
            	        case 2 :
            	            // PLSQL_DMLParser.g:887:46: SOLIDUS ^
            	            {
            	            SOLIDUS582=(Token)match(input,SOLIDUS,FOLLOW_SOLIDUS_in_multiply_expression8308); if (state.failed) return retval;
            	            if ( state.backtracking==0 ) {
            	            SOLIDUS582_tree = 
            	            (Object)adaptor.create(SOLIDUS582)
            	            ;
            	            root_0 = (Object)adaptor.becomeRoot(SOLIDUS582_tree, root_0);
            	            }

            	            }
            	            break;

            	    }


            	    pushFollow(FOLLOW_datetime_expression_in_multiply_expression8313);
            	    datetime_expression583=datetime_expression();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, datetime_expression583.getTree());

            	    }
            	    break;

            	default :
            	    break loop189;
                }
            } while (true);


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "multiply_expression"


    public static class datetime_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "datetime_expression"
    // PLSQL_DMLParser.g:890:1: datetime_expression : ( model_expression -> model_expression ) ( at_key ( local_key | time_key zone_key concatenation_wrapper ) -> ^( DATETIME_OP $datetime_expression ^( at_key ( local_key )? ( time_key )? concatenation_wrapper ) ) | ( interval_expression )=> interval_expression -> ^( DATETIME_OP $datetime_expression interval_expression ) )? ;
    public final PLSQLParser_PLSQL_DMLParser.datetime_expression_return datetime_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.datetime_expression_return retval = new PLSQLParser_PLSQL_DMLParser.datetime_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.model_expression_return model_expression584 =null;

        PLSQLParser_PLSQLKeys.at_key_return at_key585 =null;

        PLSQLParser_PLSQLKeys.local_key_return local_key586 =null;

        PLSQLParser_PLSQLKeys.time_key_return time_key587 =null;

        PLSQLParser_PLSQLKeys.zone_key_return zone_key588 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper589 =null;

        PLSQLParser_PLSQL_DMLParser.interval_expression_return interval_expression590 =null;


        RewriteRuleSubtreeStream stream_at_key=new RewriteRuleSubtreeStream(adaptor,"rule at_key");
        RewriteRuleSubtreeStream stream_concatenation_wrapper=new RewriteRuleSubtreeStream(adaptor,"rule concatenation_wrapper");
        RewriteRuleSubtreeStream stream_model_expression=new RewriteRuleSubtreeStream(adaptor,"rule model_expression");
        RewriteRuleSubtreeStream stream_local_key=new RewriteRuleSubtreeStream(adaptor,"rule local_key");
        RewriteRuleSubtreeStream stream_zone_key=new RewriteRuleSubtreeStream(adaptor,"rule zone_key");
        RewriteRuleSubtreeStream stream_interval_expression=new RewriteRuleSubtreeStream(adaptor,"rule interval_expression");
        RewriteRuleSubtreeStream stream_time_key=new RewriteRuleSubtreeStream(adaptor,"rule time_key");
        try {
            // PLSQL_DMLParser.g:891:5: ( ( model_expression -> model_expression ) ( at_key ( local_key | time_key zone_key concatenation_wrapper ) -> ^( DATETIME_OP $datetime_expression ^( at_key ( local_key )? ( time_key )? concatenation_wrapper ) ) | ( interval_expression )=> interval_expression -> ^( DATETIME_OP $datetime_expression interval_expression ) )? )
            // PLSQL_DMLParser.g:891:10: ( model_expression -> model_expression ) ( at_key ( local_key | time_key zone_key concatenation_wrapper ) -> ^( DATETIME_OP $datetime_expression ^( at_key ( local_key )? ( time_key )? concatenation_wrapper ) ) | ( interval_expression )=> interval_expression -> ^( DATETIME_OP $datetime_expression interval_expression ) )?
            {
            // PLSQL_DMLParser.g:891:10: ( model_expression -> model_expression )
            // PLSQL_DMLParser.g:891:11: model_expression
            {
            pushFollow(FOLLOW_model_expression_in_datetime_expression8336);
            model_expression584=model_expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_model_expression.add(model_expression584.getTree());

            // AST REWRITE
            // elements: model_expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 891:28: -> model_expression
            {
                adaptor.addChild(root_0, stream_model_expression.nextTree());

            }


            retval.tree = root_0;
            }

            }


            // PLSQL_DMLParser.g:892:5: ( at_key ( local_key | time_key zone_key concatenation_wrapper ) -> ^( DATETIME_OP $datetime_expression ^( at_key ( local_key )? ( time_key )? concatenation_wrapper ) ) | ( interval_expression )=> interval_expression -> ^( DATETIME_OP $datetime_expression interval_expression ) )?
            int alt191=3;
            int LA191_0 = input.LA(1);

            if ( (LA191_0==REGULAR_ID) ) {
                int LA191_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("at"))) ) {
                    alt191=1;
                }
                else if ( (((((input.LT(1).getText().equalsIgnoreCase("day"))||(input.LT(1).getText().equalsIgnoreCase("year")))&&((input.LT(1).getText().equalsIgnoreCase("day"))||(input.LT(1).getText().equalsIgnoreCase("year"))))&&synpred16_PLSQL_DMLParser())) ) {
                    alt191=2;
                }
            }
            switch (alt191) {
                case 1 :
                    // PLSQL_DMLParser.g:892:10: at_key ( local_key | time_key zone_key concatenation_wrapper )
                    {
                    pushFollow(FOLLOW_at_key_in_datetime_expression8352);
                    at_key585=gPLSQLParser.at_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_at_key.add(at_key585.getTree());

                    // PLSQL_DMLParser.g:892:17: ( local_key | time_key zone_key concatenation_wrapper )
                    int alt190=2;
                    int LA190_0 = input.LA(1);

                    if ( (LA190_0==REGULAR_ID) ) {
                        int LA190_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("local"))) ) {
                            alt190=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("time"))) ) {
                            alt190=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 190, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 190, 0, input);

                        throw nvae;

                    }
                    switch (alt190) {
                        case 1 :
                            // PLSQL_DMLParser.g:892:18: local_key
                            {
                            pushFollow(FOLLOW_local_key_in_datetime_expression8355);
                            local_key586=gPLSQLParser.local_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_local_key.add(local_key586.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:892:28: time_key zone_key concatenation_wrapper
                            {
                            pushFollow(FOLLOW_time_key_in_datetime_expression8357);
                            time_key587=gPLSQLParser.time_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_time_key.add(time_key587.getTree());

                            pushFollow(FOLLOW_zone_key_in_datetime_expression8359);
                            zone_key588=gPLSQLParser.zone_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_zone_key.add(zone_key588.getTree());

                            pushFollow(FOLLOW_concatenation_wrapper_in_datetime_expression8361);
                            concatenation_wrapper589=concatenation_wrapper();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_concatenation_wrapper.add(concatenation_wrapper589.getTree());

                            }
                            break;

                    }


                    // AST REWRITE
                    // elements: at_key, datetime_expression, concatenation_wrapper, local_key, time_key
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 893:13: -> ^( DATETIME_OP $datetime_expression ^( at_key ( local_key )? ( time_key )? concatenation_wrapper ) )
                    {
                        // PLSQL_DMLParser.g:893:16: ^( DATETIME_OP $datetime_expression ^( at_key ( local_key )? ( time_key )? concatenation_wrapper ) )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(DATETIME_OP, "DATETIME_OP")
                        , root_1);

                        adaptor.addChild(root_1, stream_retval.nextTree());

                        // PLSQL_DMLParser.g:893:51: ^( at_key ( local_key )? ( time_key )? concatenation_wrapper )
                        {
                        Object root_2 = (Object)adaptor.nil();
                        root_2 = (Object)adaptor.becomeRoot(stream_at_key.nextNode(), root_2);

                        // PLSQL_DMLParser.g:893:60: ( local_key )?
                        if ( stream_local_key.hasNext() ) {
                            adaptor.addChild(root_2, stream_local_key.nextTree());

                        }
                        stream_local_key.reset();

                        // PLSQL_DMLParser.g:893:71: ( time_key )?
                        if ( stream_time_key.hasNext() ) {
                            adaptor.addChild(root_2, stream_time_key.nextTree());

                        }
                        stream_time_key.reset();

                        adaptor.addChild(root_2, stream_concatenation_wrapper.nextTree());

                        adaptor.addChild(root_1, root_2);
                        }

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:894:10: ( interval_expression )=> interval_expression
                    {
                    pushFollow(FOLLOW_interval_expression_in_datetime_expression8411);
                    interval_expression590=interval_expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_interval_expression.add(interval_expression590.getTree());

                    // AST REWRITE
                    // elements: interval_expression, datetime_expression
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 895:13: -> ^( DATETIME_OP $datetime_expression interval_expression )
                    {
                        // PLSQL_DMLParser.g:895:16: ^( DATETIME_OP $datetime_expression interval_expression )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(DATETIME_OP, "DATETIME_OP")
                        , root_1);

                        adaptor.addChild(root_1, stream_retval.nextTree());

                        adaptor.addChild(root_1, stream_interval_expression.nextTree());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "datetime_expression"


    public static class interval_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "interval_expression"
    // PLSQL_DMLParser.g:899:1: interval_expression : ( day_key ( LEFT_PAREN cn1= concatenation_wrapper RIGHT_PAREN )? to_key second_key ( LEFT_PAREN cn2= concatenation_wrapper RIGHT_PAREN )? -> ^( day_key second_key ( $cn1)? ( $cn2)? ) | year_key ( LEFT_PAREN concatenation_wrapper RIGHT_PAREN )? to_key month_key -> ^( year_key month_key concatenation_wrapper ) );
    public final PLSQLParser_PLSQL_DMLParser.interval_expression_return interval_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.interval_expression_return retval = new PLSQLParser_PLSQL_DMLParser.interval_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN592=null;
        Token RIGHT_PAREN593=null;
        Token LEFT_PAREN596=null;
        Token RIGHT_PAREN597=null;
        Token LEFT_PAREN599=null;
        Token RIGHT_PAREN601=null;
        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return cn1 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return cn2 =null;

        PLSQLParser_PLSQLKeys.day_key_return day_key591 =null;

        PLSQLParser_PLSQLKeys.to_key_return to_key594 =null;

        PLSQLParser_PLSQLKeys.second_key_return second_key595 =null;

        PLSQLParser_PLSQLKeys.year_key_return year_key598 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper600 =null;

        PLSQLParser_PLSQLKeys.to_key_return to_key602 =null;

        PLSQLParser_PLSQLKeys.month_key_return month_key603 =null;


        Object LEFT_PAREN592_tree=null;
        Object RIGHT_PAREN593_tree=null;
        Object LEFT_PAREN596_tree=null;
        Object RIGHT_PAREN597_tree=null;
        Object LEFT_PAREN599_tree=null;
        Object RIGHT_PAREN601_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleSubtreeStream stream_year_key=new RewriteRuleSubtreeStream(adaptor,"rule year_key");
        RewriteRuleSubtreeStream stream_day_key=new RewriteRuleSubtreeStream(adaptor,"rule day_key");
        RewriteRuleSubtreeStream stream_second_key=new RewriteRuleSubtreeStream(adaptor,"rule second_key");
        RewriteRuleSubtreeStream stream_concatenation_wrapper=new RewriteRuleSubtreeStream(adaptor,"rule concatenation_wrapper");
        RewriteRuleSubtreeStream stream_to_key=new RewriteRuleSubtreeStream(adaptor,"rule to_key");
        RewriteRuleSubtreeStream stream_month_key=new RewriteRuleSubtreeStream(adaptor,"rule month_key");
        try {
            // PLSQL_DMLParser.g:900:5: ( day_key ( LEFT_PAREN cn1= concatenation_wrapper RIGHT_PAREN )? to_key second_key ( LEFT_PAREN cn2= concatenation_wrapper RIGHT_PAREN )? -> ^( day_key second_key ( $cn1)? ( $cn2)? ) | year_key ( LEFT_PAREN concatenation_wrapper RIGHT_PAREN )? to_key month_key -> ^( year_key month_key concatenation_wrapper ) )
            int alt195=2;
            int LA195_0 = input.LA(1);

            if ( (LA195_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("day"))||(input.LT(1).getText().equalsIgnoreCase("year"))))) {
                int LA195_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("day"))) ) {
                    alt195=1;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("year"))) ) {
                    alt195=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 195, 1, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 195, 0, input);

                throw nvae;

            }
            switch (alt195) {
                case 1 :
                    // PLSQL_DMLParser.g:900:10: day_key ( LEFT_PAREN cn1= concatenation_wrapper RIGHT_PAREN )? to_key second_key ( LEFT_PAREN cn2= concatenation_wrapper RIGHT_PAREN )?
                    {
                    pushFollow(FOLLOW_day_key_in_interval_expression8461);
                    day_key591=gPLSQLParser.day_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_day_key.add(day_key591.getTree());

                    // PLSQL_DMLParser.g:900:21: ( LEFT_PAREN cn1= concatenation_wrapper RIGHT_PAREN )?
                    int alt192=2;
                    int LA192_0 = input.LA(1);

                    if ( (LA192_0==LEFT_PAREN) ) {
                        alt192=1;
                    }
                    switch (alt192) {
                        case 1 :
                            // PLSQL_DMLParser.g:900:22: LEFT_PAREN cn1= concatenation_wrapper RIGHT_PAREN
                            {
                            LEFT_PAREN592=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_interval_expression8467); if (state.failed) return retval; 
                            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN592);


                            pushFollow(FOLLOW_concatenation_wrapper_in_interval_expression8471);
                            cn1=concatenation_wrapper();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_concatenation_wrapper.add(cn1.getTree());

                            RIGHT_PAREN593=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_interval_expression8473); if (state.failed) return retval; 
                            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN593);


                            }
                            break;

                    }


                    pushFollow(FOLLOW_to_key_in_interval_expression8477);
                    to_key594=gPLSQLParser.to_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_to_key.add(to_key594.getTree());

                    pushFollow(FOLLOW_second_key_in_interval_expression8479);
                    second_key595=gPLSQLParser.second_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_second_key.add(second_key595.getTree());

                    // PLSQL_DMLParser.g:900:91: ( LEFT_PAREN cn2= concatenation_wrapper RIGHT_PAREN )?
                    int alt193=2;
                    alt193 = dfa193.predict(input);
                    switch (alt193) {
                        case 1 :
                            // PLSQL_DMLParser.g:900:92: LEFT_PAREN cn2= concatenation_wrapper RIGHT_PAREN
                            {
                            LEFT_PAREN596=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_interval_expression8482); if (state.failed) return retval; 
                            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN596);


                            pushFollow(FOLLOW_concatenation_wrapper_in_interval_expression8486);
                            cn2=concatenation_wrapper();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_concatenation_wrapper.add(cn2.getTree());

                            RIGHT_PAREN597=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_interval_expression8488); if (state.failed) return retval; 
                            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN597);


                            }
                            break;

                    }


                    // AST REWRITE
                    // elements: day_key, cn2, cn1, second_key
                    // token labels: 
                    // rule labels: retval, cn2, cn1
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
                    RewriteRuleSubtreeStream stream_cn2=new RewriteRuleSubtreeStream(adaptor,"rule cn2",cn2!=null?cn2.tree:null);
                    RewriteRuleSubtreeStream stream_cn1=new RewriteRuleSubtreeStream(adaptor,"rule cn1",cn1!=null?cn1.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 901:9: -> ^( day_key second_key ( $cn1)? ( $cn2)? )
                    {
                        // PLSQL_DMLParser.g:901:12: ^( day_key second_key ( $cn1)? ( $cn2)? )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(stream_day_key.nextNode(), root_1);

                        adaptor.addChild(root_1, stream_second_key.nextTree());

                        // PLSQL_DMLParser.g:901:34: ( $cn1)?
                        if ( stream_cn1.hasNext() ) {
                            adaptor.addChild(root_1, stream_cn1.nextTree());

                        }
                        stream_cn1.reset();

                        // PLSQL_DMLParser.g:901:40: ( $cn2)?
                        if ( stream_cn2.hasNext() ) {
                            adaptor.addChild(root_1, stream_cn2.nextTree());

                        }
                        stream_cn2.reset();

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:902:10: year_key ( LEFT_PAREN concatenation_wrapper RIGHT_PAREN )? to_key month_key
                    {
                    pushFollow(FOLLOW_year_key_in_interval_expression8525);
                    year_key598=gPLSQLParser.year_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_year_key.add(year_key598.getTree());

                    // PLSQL_DMLParser.g:902:19: ( LEFT_PAREN concatenation_wrapper RIGHT_PAREN )?
                    int alt194=2;
                    int LA194_0 = input.LA(1);

                    if ( (LA194_0==LEFT_PAREN) ) {
                        alt194=1;
                    }
                    switch (alt194) {
                        case 1 :
                            // PLSQL_DMLParser.g:902:20: LEFT_PAREN concatenation_wrapper RIGHT_PAREN
                            {
                            LEFT_PAREN599=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_interval_expression8528); if (state.failed) return retval; 
                            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN599);


                            pushFollow(FOLLOW_concatenation_wrapper_in_interval_expression8530);
                            concatenation_wrapper600=concatenation_wrapper();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_concatenation_wrapper.add(concatenation_wrapper600.getTree());

                            RIGHT_PAREN601=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_interval_expression8532); if (state.failed) return retval; 
                            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN601);


                            }
                            break;

                    }


                    pushFollow(FOLLOW_to_key_in_interval_expression8536);
                    to_key602=gPLSQLParser.to_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_to_key.add(to_key602.getTree());

                    pushFollow(FOLLOW_month_key_in_interval_expression8538);
                    month_key603=gPLSQLParser.month_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_month_key.add(month_key603.getTree());

                    // AST REWRITE
                    // elements: year_key, month_key, concatenation_wrapper
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 903:9: -> ^( year_key month_key concatenation_wrapper )
                    {
                        // PLSQL_DMLParser.g:903:12: ^( year_key month_key concatenation_wrapper )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(stream_year_key.nextNode(), root_1);

                        adaptor.addChild(root_1, stream_month_key.nextTree());

                        adaptor.addChild(root_1, stream_concatenation_wrapper.nextTree());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "interval_expression"


    public static class model_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "model_expression"
    // PLSQL_DMLParser.g:906:1: model_expression : ( keep_expression -> keep_expression ) ( LEFT_BRACKET model_expression_element RIGHT_BRACKET -> ^( MODEL_EXPRESSION[$LEFT_BRACKET] $model_expression model_expression_element ) )? ;
    public final PLSQLParser_PLSQL_DMLParser.model_expression_return model_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.model_expression_return retval = new PLSQLParser_PLSQL_DMLParser.model_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_BRACKET605=null;
        Token RIGHT_BRACKET607=null;
        PLSQLParser_PLSQL_DMLParser.keep_expression_return keep_expression604 =null;

        PLSQLParser_PLSQL_DMLParser.model_expression_element_return model_expression_element606 =null;


        Object LEFT_BRACKET605_tree=null;
        Object RIGHT_BRACKET607_tree=null;
        RewriteRuleTokenStream stream_LEFT_BRACKET=new RewriteRuleTokenStream(adaptor,"token LEFT_BRACKET");
        RewriteRuleTokenStream stream_RIGHT_BRACKET=new RewriteRuleTokenStream(adaptor,"token RIGHT_BRACKET");
        RewriteRuleSubtreeStream stream_model_expression_element=new RewriteRuleSubtreeStream(adaptor,"rule model_expression_element");
        RewriteRuleSubtreeStream stream_keep_expression=new RewriteRuleSubtreeStream(adaptor,"rule keep_expression");
        try {
            // PLSQL_DMLParser.g:907:5: ( ( keep_expression -> keep_expression ) ( LEFT_BRACKET model_expression_element RIGHT_BRACKET -> ^( MODEL_EXPRESSION[$LEFT_BRACKET] $model_expression model_expression_element ) )? )
            // PLSQL_DMLParser.g:907:10: ( keep_expression -> keep_expression ) ( LEFT_BRACKET model_expression_element RIGHT_BRACKET -> ^( MODEL_EXPRESSION[$LEFT_BRACKET] $model_expression model_expression_element ) )?
            {
            // PLSQL_DMLParser.g:907:10: ( keep_expression -> keep_expression )
            // PLSQL_DMLParser.g:907:11: keep_expression
            {
            pushFollow(FOLLOW_keep_expression_in_model_expression8577);
            keep_expression604=keep_expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_keep_expression.add(keep_expression604.getTree());

            // AST REWRITE
            // elements: keep_expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 907:27: -> keep_expression
            {
                adaptor.addChild(root_0, stream_keep_expression.nextTree());

            }


            retval.tree = root_0;
            }

            }


            // PLSQL_DMLParser.g:908:9: ( LEFT_BRACKET model_expression_element RIGHT_BRACKET -> ^( MODEL_EXPRESSION[$LEFT_BRACKET] $model_expression model_expression_element ) )?
            int alt196=2;
            int LA196_0 = input.LA(1);

            if ( (LA196_0==LEFT_BRACKET) ) {
                alt196=1;
            }
            switch (alt196) {
                case 1 :
                    // PLSQL_DMLParser.g:908:10: LEFT_BRACKET model_expression_element RIGHT_BRACKET
                    {
                    LEFT_BRACKET605=(Token)match(input,LEFT_BRACKET,FOLLOW_LEFT_BRACKET_in_model_expression8594); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_LEFT_BRACKET.add(LEFT_BRACKET605);


                    pushFollow(FOLLOW_model_expression_element_in_model_expression8596);
                    model_expression_element606=model_expression_element();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_model_expression_element.add(model_expression_element606.getTree());

                    RIGHT_BRACKET607=(Token)match(input,RIGHT_BRACKET,FOLLOW_RIGHT_BRACKET_in_model_expression8598); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_RIGHT_BRACKET.add(RIGHT_BRACKET607);


                    // AST REWRITE
                    // elements: model_expression, model_expression_element
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 909:13: -> ^( MODEL_EXPRESSION[$LEFT_BRACKET] $model_expression model_expression_element )
                    {
                        // PLSQL_DMLParser.g:909:16: ^( MODEL_EXPRESSION[$LEFT_BRACKET] $model_expression model_expression_element )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(MODEL_EXPRESSION, LEFT_BRACKET605)
                        , root_1);

                        adaptor.addChild(root_1, stream_retval.nextTree());

                        adaptor.addChild(root_1, stream_model_expression_element.nextTree());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "model_expression"


    public static class model_expression_element_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "model_expression_element"
    // PLSQL_DMLParser.g:912:1: model_expression_element : ( ( ( any_key )=> any_key | condition_wrapper ) ( COMMA ! ( ( any_key )=> any_key | condition_wrapper ) )* | single_column_for_loop ( COMMA ! single_column_for_loop )* | multi_column_for_loop );
    public final PLSQLParser_PLSQL_DMLParser.model_expression_element_return model_expression_element() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.model_expression_element_return retval = new PLSQLParser_PLSQL_DMLParser.model_expression_element_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COMMA610=null;
        Token COMMA614=null;
        PLSQLParser_PLSQLKeys.any_key_return any_key608 =null;

        PLSQLParser_PLSQL_DMLParser.condition_wrapper_return condition_wrapper609 =null;

        PLSQLParser_PLSQLKeys.any_key_return any_key611 =null;

        PLSQLParser_PLSQL_DMLParser.condition_wrapper_return condition_wrapper612 =null;

        PLSQLParser_PLSQL_DMLParser.single_column_for_loop_return single_column_for_loop613 =null;

        PLSQLParser_PLSQL_DMLParser.single_column_for_loop_return single_column_for_loop615 =null;

        PLSQLParser_PLSQL_DMLParser.multi_column_for_loop_return multi_column_for_loop616 =null;


        Object COMMA610_tree=null;
        Object COMMA614_tree=null;

        try {
            // PLSQL_DMLParser.g:913:5: ( ( ( any_key )=> any_key | condition_wrapper ) ( COMMA ! ( ( any_key )=> any_key | condition_wrapper ) )* | single_column_for_loop ( COMMA ! single_column_for_loop )* | multi_column_for_loop )
            int alt201=3;
            int LA201_0 = input.LA(1);

            if ( (LA201_0==APPROXIMATE_NUM_LIT||(LA201_0 >= CHAR_STRING && LA201_0 <= COLON)||LA201_0==DELIMITED_ID||LA201_0==EXACT_NUM_LIT||LA201_0==INTRODUCER||LA201_0==LEFT_PAREN||LA201_0==MINUS_SIGN||LA201_0==PLUS_SIGN||LA201_0==REGULAR_ID||LA201_0==SQL92_RESERVED_ALL||LA201_0==SQL92_RESERVED_ANY||LA201_0==SQL92_RESERVED_CASE||LA201_0==SQL92_RESERVED_DEFAULT||LA201_0==SQL92_RESERVED_DISTINCT||(LA201_0 >= SQL92_RESERVED_EXISTS && LA201_0 <= SQL92_RESERVED_FALSE)||(LA201_0 >= SQL92_RESERVED_NOT && LA201_0 <= SQL92_RESERVED_NULL)||LA201_0==SQL92_RESERVED_PRIOR||LA201_0==SQL92_RESERVED_TRUE||LA201_0==UNSIGNED_INTEGER) ) {
                alt201=1;
            }
            else if ( (LA201_0==SQL92_RESERVED_FOR) ) {
                int LA201_2 = input.LA(2);

                if ( (LA201_2==DELIMITED_ID||LA201_2==INTRODUCER||LA201_2==REGULAR_ID) ) {
                    alt201=2;
                }
                else if ( (LA201_2==LEFT_PAREN) ) {
                    alt201=3;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 201, 2, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 201, 0, input);

                throw nvae;

            }
            switch (alt201) {
                case 1 :
                    // PLSQL_DMLParser.g:913:10: ( ( any_key )=> any_key | condition_wrapper ) ( COMMA ! ( ( any_key )=> any_key | condition_wrapper ) )*
                    {
                    root_0 = (Object)adaptor.nil();


                    // PLSQL_DMLParser.g:913:10: ( ( any_key )=> any_key | condition_wrapper )
                    int alt197=2;
                    int LA197_0 = input.LA(1);

                    if ( (LA197_0==SQL92_RESERVED_ANY) ) {
                        int LA197_1 = input.LA(2);

                        if ( (LA197_1==COMMA) && (synpred17_PLSQL_DMLParser())) {
                            alt197=1;
                        }
                        else if ( (LA197_1==RIGHT_BRACKET) && (synpred17_PLSQL_DMLParser())) {
                            alt197=1;
                        }
                        else if ( (LA197_1==LEFT_PAREN) ) {
                            alt197=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 197, 1, input);

                            throw nvae;

                        }
                    }
                    else if ( (LA197_0==APPROXIMATE_NUM_LIT||(LA197_0 >= CHAR_STRING && LA197_0 <= COLON)||LA197_0==DELIMITED_ID||LA197_0==EXACT_NUM_LIT||LA197_0==INTRODUCER||LA197_0==LEFT_PAREN||LA197_0==MINUS_SIGN||LA197_0==PLUS_SIGN||LA197_0==REGULAR_ID||LA197_0==SQL92_RESERVED_ALL||LA197_0==SQL92_RESERVED_CASE||LA197_0==SQL92_RESERVED_DEFAULT||LA197_0==SQL92_RESERVED_DISTINCT||(LA197_0 >= SQL92_RESERVED_EXISTS && LA197_0 <= SQL92_RESERVED_FALSE)||(LA197_0 >= SQL92_RESERVED_NOT && LA197_0 <= SQL92_RESERVED_NULL)||LA197_0==SQL92_RESERVED_PRIOR||LA197_0==SQL92_RESERVED_TRUE||LA197_0==UNSIGNED_INTEGER) ) {
                        alt197=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 197, 0, input);

                        throw nvae;

                    }
                    switch (alt197) {
                        case 1 :
                            // PLSQL_DMLParser.g:913:11: ( any_key )=> any_key
                            {
                            pushFollow(FOLLOW_any_key_in_model_expression_element8650);
                            any_key608=gPLSQLParser.any_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, any_key608.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:913:31: condition_wrapper
                            {
                            pushFollow(FOLLOW_condition_wrapper_in_model_expression_element8652);
                            condition_wrapper609=condition_wrapper();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, condition_wrapper609.getTree());

                            }
                            break;

                    }


                    // PLSQL_DMLParser.g:913:50: ( COMMA ! ( ( any_key )=> any_key | condition_wrapper ) )*
                    loop199:
                    do {
                        int alt199=2;
                        int LA199_0 = input.LA(1);

                        if ( (LA199_0==COMMA) ) {
                            alt199=1;
                        }


                        switch (alt199) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:913:51: COMMA ! ( ( any_key )=> any_key | condition_wrapper )
                    	    {
                    	    COMMA610=(Token)match(input,COMMA,FOLLOW_COMMA_in_model_expression_element8656); if (state.failed) return retval;

                    	    // PLSQL_DMLParser.g:913:58: ( ( any_key )=> any_key | condition_wrapper )
                    	    int alt198=2;
                    	    int LA198_0 = input.LA(1);

                    	    if ( (LA198_0==SQL92_RESERVED_ANY) ) {
                    	        int LA198_1 = input.LA(2);

                    	        if ( (LA198_1==RIGHT_BRACKET) && (synpred18_PLSQL_DMLParser())) {
                    	            alt198=1;
                    	        }
                    	        else if ( (LA198_1==COMMA) && (synpred18_PLSQL_DMLParser())) {
                    	            alt198=1;
                    	        }
                    	        else if ( (LA198_1==LEFT_PAREN) ) {
                    	            alt198=2;
                    	        }
                    	        else {
                    	            if (state.backtracking>0) {state.failed=true; return retval;}
                    	            NoViableAltException nvae =
                    	                new NoViableAltException("", 198, 1, input);

                    	            throw nvae;

                    	        }
                    	    }
                    	    else if ( (LA198_0==APPROXIMATE_NUM_LIT||(LA198_0 >= CHAR_STRING && LA198_0 <= COLON)||LA198_0==DELIMITED_ID||LA198_0==EXACT_NUM_LIT||LA198_0==INTRODUCER||LA198_0==LEFT_PAREN||LA198_0==MINUS_SIGN||LA198_0==PLUS_SIGN||LA198_0==REGULAR_ID||LA198_0==SQL92_RESERVED_ALL||LA198_0==SQL92_RESERVED_CASE||LA198_0==SQL92_RESERVED_DEFAULT||LA198_0==SQL92_RESERVED_DISTINCT||(LA198_0 >= SQL92_RESERVED_EXISTS && LA198_0 <= SQL92_RESERVED_FALSE)||(LA198_0 >= SQL92_RESERVED_NOT && LA198_0 <= SQL92_RESERVED_NULL)||LA198_0==SQL92_RESERVED_PRIOR||LA198_0==SQL92_RESERVED_TRUE||LA198_0==UNSIGNED_INTEGER) ) {
                    	        alt198=2;
                    	    }
                    	    else {
                    	        if (state.backtracking>0) {state.failed=true; return retval;}
                    	        NoViableAltException nvae =
                    	            new NoViableAltException("", 198, 0, input);

                    	        throw nvae;

                    	    }
                    	    switch (alt198) {
                    	        case 1 :
                    	            // PLSQL_DMLParser.g:913:59: ( any_key )=> any_key
                    	            {
                    	            pushFollow(FOLLOW_any_key_in_model_expression_element8665);
                    	            any_key611=gPLSQLParser.any_key();

                    	            state._fsp--;
                    	            if (state.failed) return retval;
                    	            if ( state.backtracking==0 ) adaptor.addChild(root_0, any_key611.getTree());

                    	            }
                    	            break;
                    	        case 2 :
                    	            // PLSQL_DMLParser.g:913:79: condition_wrapper
                    	            {
                    	            pushFollow(FOLLOW_condition_wrapper_in_model_expression_element8667);
                    	            condition_wrapper612=condition_wrapper();

                    	            state._fsp--;
                    	            if (state.failed) return retval;
                    	            if ( state.backtracking==0 ) adaptor.addChild(root_0, condition_wrapper612.getTree());

                    	            }
                    	            break;

                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop199;
                        }
                    } while (true);


                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:914:10: single_column_for_loop ( COMMA ! single_column_for_loop )*
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_single_column_for_loop_in_model_expression_element8681);
                    single_column_for_loop613=single_column_for_loop();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, single_column_for_loop613.getTree());

                    // PLSQL_DMLParser.g:914:33: ( COMMA ! single_column_for_loop )*
                    loop200:
                    do {
                        int alt200=2;
                        int LA200_0 = input.LA(1);

                        if ( (LA200_0==COMMA) ) {
                            alt200=1;
                        }


                        switch (alt200) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:914:34: COMMA ! single_column_for_loop
                    	    {
                    	    COMMA614=(Token)match(input,COMMA,FOLLOW_COMMA_in_model_expression_element8684); if (state.failed) return retval;

                    	    pushFollow(FOLLOW_single_column_for_loop_in_model_expression_element8687);
                    	    single_column_for_loop615=single_column_for_loop();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) adaptor.addChild(root_0, single_column_for_loop615.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop200;
                        }
                    } while (true);


                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:915:10: multi_column_for_loop
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_multi_column_for_loop_in_model_expression_element8700);
                    multi_column_for_loop616=multi_column_for_loop();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, multi_column_for_loop616.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "model_expression_element"


    public static class single_column_for_loop_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "single_column_for_loop"
    // PLSQL_DMLParser.g:918:1: single_column_for_loop : for_key column_name ( in_key expression_list | ( for_like_part )? from_key ex1= expression to_key ex2= expression for_increment_decrement_type ex3= expression ) -> {mode == 1}? ^( FOR_SINGLE_COLUMN[$for_key.start] column_name ^( in_key expression_list ) ) -> ^( FOR_SINGLE_COLUMN[$for_key.start] column_name ^( from_key ^( EXPR $ex1) ) ^( to_key ^( EXPR $ex2) ) ^( for_increment_decrement_type ^( EXPR $ex3) ) ( for_like_part )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.single_column_for_loop_return single_column_for_loop() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.single_column_for_loop_return retval = new PLSQLParser_PLSQL_DMLParser.single_column_for_loop_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.expression_return ex1 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return ex2 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return ex3 =null;

        PLSQLParser_PLSQLKeys.for_key_return for_key617 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name618 =null;

        PLSQLParser_PLSQLKeys.in_key_return in_key619 =null;

        PLSQLParser_PLSQL_DMLParser.expression_list_return expression_list620 =null;

        PLSQLParser_PLSQL_DMLParser.for_like_part_return for_like_part621 =null;

        PLSQLParser_PLSQLKeys.from_key_return from_key622 =null;

        PLSQLParser_PLSQLKeys.to_key_return to_key623 =null;

        PLSQLParser_PLSQL_DMLParser.for_increment_decrement_type_return for_increment_decrement_type624 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_expression_list=new RewriteRuleSubtreeStream(adaptor,"rule expression_list");
        RewriteRuleSubtreeStream stream_for_like_part=new RewriteRuleSubtreeStream(adaptor,"rule for_like_part");
        RewriteRuleSubtreeStream stream_to_key=new RewriteRuleSubtreeStream(adaptor,"rule to_key");
        RewriteRuleSubtreeStream stream_column_name=new RewriteRuleSubtreeStream(adaptor,"rule column_name");
        RewriteRuleSubtreeStream stream_for_increment_decrement_type=new RewriteRuleSubtreeStream(adaptor,"rule for_increment_decrement_type");
        RewriteRuleSubtreeStream stream_in_key=new RewriteRuleSubtreeStream(adaptor,"rule in_key");
        RewriteRuleSubtreeStream stream_for_key=new RewriteRuleSubtreeStream(adaptor,"rule for_key");
        RewriteRuleSubtreeStream stream_from_key=new RewriteRuleSubtreeStream(adaptor,"rule from_key");
            int mode = 0;    
        try {
            // PLSQL_DMLParser.g:920:5: ( for_key column_name ( in_key expression_list | ( for_like_part )? from_key ex1= expression to_key ex2= expression for_increment_decrement_type ex3= expression ) -> {mode == 1}? ^( FOR_SINGLE_COLUMN[$for_key.start] column_name ^( in_key expression_list ) ) -> ^( FOR_SINGLE_COLUMN[$for_key.start] column_name ^( from_key ^( EXPR $ex1) ) ^( to_key ^( EXPR $ex2) ) ^( for_increment_decrement_type ^( EXPR $ex3) ) ( for_like_part )? ) )
            // PLSQL_DMLParser.g:920:10: for_key column_name ( in_key expression_list | ( for_like_part )? from_key ex1= expression to_key ex2= expression for_increment_decrement_type ex3= expression )
            {
            pushFollow(FOLLOW_for_key_in_single_column_for_loop8728);
            for_key617=gPLSQLParser.for_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_for_key.add(for_key617.getTree());

            pushFollow(FOLLOW_column_name_in_single_column_for_loop8730);
            column_name618=gPLSQLParser.column_name();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_column_name.add(column_name618.getTree());

            // PLSQL_DMLParser.g:921:5: ( in_key expression_list | ( for_like_part )? from_key ex1= expression to_key ex2= expression for_increment_decrement_type ex3= expression )
            int alt203=2;
            int LA203_0 = input.LA(1);

            if ( (LA203_0==SQL92_RESERVED_IN) ) {
                alt203=1;
            }
            else if ( (LA203_0==SQL92_RESERVED_FROM||LA203_0==SQL92_RESERVED_LIKE) ) {
                alt203=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 203, 0, input);

                throw nvae;

            }
            switch (alt203) {
                case 1 :
                    // PLSQL_DMLParser.g:921:10: in_key expression_list
                    {
                    pushFollow(FOLLOW_in_key_in_single_column_for_loop8742);
                    in_key619=gPLSQLParser.in_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_in_key.add(in_key619.getTree());

                    pushFollow(FOLLOW_expression_list_in_single_column_for_loop8744);
                    expression_list620=expression_list();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression_list.add(expression_list620.getTree());

                    if ( state.backtracking==0 ) {mode = 1;}

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:922:10: ( for_like_part )? from_key ex1= expression to_key ex2= expression for_increment_decrement_type ex3= expression
                    {
                    // PLSQL_DMLParser.g:922:10: ( for_like_part )?
                    int alt202=2;
                    int LA202_0 = input.LA(1);

                    if ( (LA202_0==SQL92_RESERVED_LIKE) ) {
                        alt202=1;
                    }
                    switch (alt202) {
                        case 1 :
                            // PLSQL_DMLParser.g:922:10: for_like_part
                            {
                            pushFollow(FOLLOW_for_like_part_in_single_column_for_loop8757);
                            for_like_part621=for_like_part();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_for_like_part.add(for_like_part621.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_from_key_in_single_column_for_loop8760);
                    from_key622=gPLSQLParser.from_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_from_key.add(from_key622.getTree());

                    pushFollow(FOLLOW_expression_in_single_column_for_loop8764);
                    ex1=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(ex1.getTree());

                    pushFollow(FOLLOW_to_key_in_single_column_for_loop8778);
                    to_key623=gPLSQLParser.to_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_to_key.add(to_key623.getTree());

                    pushFollow(FOLLOW_expression_in_single_column_for_loop8782);
                    ex2=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(ex2.getTree());

                    pushFollow(FOLLOW_for_increment_decrement_type_in_single_column_for_loop8784);
                    for_increment_decrement_type624=for_increment_decrement_type();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_for_increment_decrement_type.add(for_increment_decrement_type624.getTree());

                    pushFollow(FOLLOW_expression_in_single_column_for_loop8788);
                    ex3=expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression.add(ex3.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: for_increment_decrement_type, from_key, ex1, column_name, expression_list, ex3, to_key, column_name, ex2, in_key, for_like_part
            // token labels: 
            // rule labels: retval, ex3, ex2, ex1
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);
            RewriteRuleSubtreeStream stream_ex3=new RewriteRuleSubtreeStream(adaptor,"rule ex3",ex3!=null?ex3.tree:null);
            RewriteRuleSubtreeStream stream_ex2=new RewriteRuleSubtreeStream(adaptor,"rule ex2",ex2!=null?ex2.tree:null);
            RewriteRuleSubtreeStream stream_ex1=new RewriteRuleSubtreeStream(adaptor,"rule ex1",ex1!=null?ex1.tree:null);

            root_0 = (Object)adaptor.nil();
            // 925:9: -> {mode == 1}? ^( FOR_SINGLE_COLUMN[$for_key.start] column_name ^( in_key expression_list ) )
            if (mode == 1) {
                // PLSQL_DMLParser.g:925:24: ^( FOR_SINGLE_COLUMN[$for_key.start] column_name ^( in_key expression_list ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(FOR_SINGLE_COLUMN, (for_key617!=null?((Token)for_key617.start):null))
                , root_1);

                adaptor.addChild(root_1, stream_column_name.nextTree());

                // PLSQL_DMLParser.g:925:72: ^( in_key expression_list )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_in_key.nextNode(), root_2);

                adaptor.addChild(root_2, stream_expression_list.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }

            else // 926:9: -> ^( FOR_SINGLE_COLUMN[$for_key.start] column_name ^( from_key ^( EXPR $ex1) ) ^( to_key ^( EXPR $ex2) ) ^( for_increment_decrement_type ^( EXPR $ex3) ) ( for_like_part )? )
            {
                // PLSQL_DMLParser.g:926:12: ^( FOR_SINGLE_COLUMN[$for_key.start] column_name ^( from_key ^( EXPR $ex1) ) ^( to_key ^( EXPR $ex2) ) ^( for_increment_decrement_type ^( EXPR $ex3) ) ( for_like_part )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(FOR_SINGLE_COLUMN, (for_key617!=null?((Token)for_key617.start):null))
                , root_1);

                adaptor.addChild(root_1, stream_column_name.nextTree());

                // PLSQL_DMLParser.g:926:60: ^( from_key ^( EXPR $ex1) )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_from_key.nextNode(), root_2);

                // PLSQL_DMLParser.g:926:71: ^( EXPR $ex1)
                {
                Object root_3 = (Object)adaptor.nil();
                root_3 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_3);

                adaptor.addChild(root_3, stream_ex1.nextTree());

                adaptor.addChild(root_2, root_3);
                }

                adaptor.addChild(root_1, root_2);
                }

                // PLSQL_DMLParser.g:926:85: ^( to_key ^( EXPR $ex2) )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_to_key.nextNode(), root_2);

                // PLSQL_DMLParser.g:926:94: ^( EXPR $ex2)
                {
                Object root_3 = (Object)adaptor.nil();
                root_3 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_3);

                adaptor.addChild(root_3, stream_ex2.nextTree());

                adaptor.addChild(root_2, root_3);
                }

                adaptor.addChild(root_1, root_2);
                }

                // PLSQL_DMLParser.g:926:108: ^( for_increment_decrement_type ^( EXPR $ex3) )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_for_increment_decrement_type.nextNode(), root_2);

                // PLSQL_DMLParser.g:926:139: ^( EXPR $ex3)
                {
                Object root_3 = (Object)adaptor.nil();
                root_3 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_3);

                adaptor.addChild(root_3, stream_ex3.nextTree());

                adaptor.addChild(root_2, root_3);
                }

                adaptor.addChild(root_1, root_2);
                }

                // PLSQL_DMLParser.g:926:153: ( for_like_part )?
                if ( stream_for_like_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_for_like_part.nextTree());

                }
                stream_for_like_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "single_column_for_loop"


    public static class for_like_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "for_like_part"
    // PLSQL_DMLParser.g:929:1: for_like_part : like_key expression -> ^( like_key ^( EXPR expression ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.for_like_part_return for_like_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.for_like_part_return retval = new PLSQLParser_PLSQL_DMLParser.for_like_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.like_key_return like_key625 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression626 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_like_key=new RewriteRuleSubtreeStream(adaptor,"rule like_key");
        try {
            // PLSQL_DMLParser.g:930:5: ( like_key expression -> ^( like_key ^( EXPR expression ) ) )
            // PLSQL_DMLParser.g:930:10: like_key expression
            {
            pushFollow(FOLLOW_like_key_in_for_like_part8897);
            like_key625=gPLSQLParser.like_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_like_key.add(like_key625.getTree());

            pushFollow(FOLLOW_expression_in_for_like_part8899);
            expression626=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression626.getTree());

            // AST REWRITE
            // elements: like_key, expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 931:9: -> ^( like_key ^( EXPR expression ) )
            {
                // PLSQL_DMLParser.g:931:12: ^( like_key ^( EXPR expression ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_like_key.nextNode(), root_1);

                // PLSQL_DMLParser.g:931:23: ^( EXPR expression )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_expression.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "for_like_part"


    public static class for_increment_decrement_type_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "for_increment_decrement_type"
    // PLSQL_DMLParser.g:934:1: for_increment_decrement_type : ( increment_key | decrement_key );
    public final PLSQLParser_PLSQL_DMLParser.for_increment_decrement_type_return for_increment_decrement_type() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.for_increment_decrement_type_return retval = new PLSQLParser_PLSQL_DMLParser.for_increment_decrement_type_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.increment_key_return increment_key627 =null;

        PLSQLParser_PLSQLKeys.decrement_key_return decrement_key628 =null;



        try {
            // PLSQL_DMLParser.g:935:5: ( increment_key | decrement_key )
            int alt204=2;
            int LA204_0 = input.LA(1);

            if ( (LA204_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("decrement"))||(input.LT(1).getText().equalsIgnoreCase("increment"))))) {
                int LA204_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("increment"))) ) {
                    alt204=1;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("decrement"))) ) {
                    alt204=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 204, 1, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 204, 0, input);

                throw nvae;

            }
            switch (alt204) {
                case 1 :
                    // PLSQL_DMLParser.g:935:10: increment_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_increment_key_in_for_increment_decrement_type8939);
                    increment_key627=gPLSQLParser.increment_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, increment_key627.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:936:10: decrement_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_decrement_key_in_for_increment_decrement_type8950);
                    decrement_key628=gPLSQLParser.decrement_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, decrement_key628.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "for_increment_decrement_type"


    public static class multi_column_for_loop_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "multi_column_for_loop"
    // PLSQL_DMLParser.g:939:1: multi_column_for_loop : for_key LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN in_key LEFT_PAREN ( ( select_key )=> subquery | ( LEFT_PAREN )=> LEFT_PAREN expression_list ( COMMA expression_list )* RIGHT_PAREN ) RIGHT_PAREN -> ^( FOR_MULTI_COLUMN[$for_key.start] ( column_name )+ ^( in_key ( subquery )? ( expression_list )* ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.multi_column_for_loop_return multi_column_for_loop() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.multi_column_for_loop_return retval = new PLSQLParser_PLSQL_DMLParser.multi_column_for_loop_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN630=null;
        Token COMMA632=null;
        Token RIGHT_PAREN634=null;
        Token LEFT_PAREN636=null;
        Token LEFT_PAREN638=null;
        Token COMMA640=null;
        Token RIGHT_PAREN642=null;
        Token RIGHT_PAREN643=null;
        PLSQLParser_PLSQLKeys.for_key_return for_key629 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name631 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name633 =null;

        PLSQLParser_PLSQLKeys.in_key_return in_key635 =null;

        PLSQLParser_PLSQL_DMLParser.subquery_return subquery637 =null;

        PLSQLParser_PLSQL_DMLParser.expression_list_return expression_list639 =null;

        PLSQLParser_PLSQL_DMLParser.expression_list_return expression_list641 =null;


        Object LEFT_PAREN630_tree=null;
        Object COMMA632_tree=null;
        Object RIGHT_PAREN634_tree=null;
        Object LEFT_PAREN636_tree=null;
        Object LEFT_PAREN638_tree=null;
        Object COMMA640_tree=null;
        Object RIGHT_PAREN642_tree=null;
        Object RIGHT_PAREN643_tree=null;
        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_expression_list=new RewriteRuleSubtreeStream(adaptor,"rule expression_list");
        RewriteRuleSubtreeStream stream_column_name=new RewriteRuleSubtreeStream(adaptor,"rule column_name");
        RewriteRuleSubtreeStream stream_in_key=new RewriteRuleSubtreeStream(adaptor,"rule in_key");
        RewriteRuleSubtreeStream stream_for_key=new RewriteRuleSubtreeStream(adaptor,"rule for_key");
        RewriteRuleSubtreeStream stream_subquery=new RewriteRuleSubtreeStream(adaptor,"rule subquery");
        try {
            // PLSQL_DMLParser.g:940:5: ( for_key LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN in_key LEFT_PAREN ( ( select_key )=> subquery | ( LEFT_PAREN )=> LEFT_PAREN expression_list ( COMMA expression_list )* RIGHT_PAREN ) RIGHT_PAREN -> ^( FOR_MULTI_COLUMN[$for_key.start] ( column_name )+ ^( in_key ( subquery )? ( expression_list )* ) ) )
            // PLSQL_DMLParser.g:940:10: for_key LEFT_PAREN column_name ( COMMA column_name )* RIGHT_PAREN in_key LEFT_PAREN ( ( select_key )=> subquery | ( LEFT_PAREN )=> LEFT_PAREN expression_list ( COMMA expression_list )* RIGHT_PAREN ) RIGHT_PAREN
            {
            pushFollow(FOLLOW_for_key_in_multi_column_for_loop8970);
            for_key629=gPLSQLParser.for_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_for_key.add(for_key629.getTree());

            LEFT_PAREN630=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_multi_column_for_loop8972); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN630);


            pushFollow(FOLLOW_column_name_in_multi_column_for_loop8974);
            column_name631=gPLSQLParser.column_name();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_column_name.add(column_name631.getTree());

            // PLSQL_DMLParser.g:940:41: ( COMMA column_name )*
            loop205:
            do {
                int alt205=2;
                int LA205_0 = input.LA(1);

                if ( (LA205_0==COMMA) ) {
                    alt205=1;
                }


                switch (alt205) {
            	case 1 :
            	    // PLSQL_DMLParser.g:940:42: COMMA column_name
            	    {
            	    COMMA632=(Token)match(input,COMMA,FOLLOW_COMMA_in_multi_column_for_loop8977); if (state.failed) return retval; 
            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA632);


            	    pushFollow(FOLLOW_column_name_in_multi_column_for_loop8979);
            	    column_name633=gPLSQLParser.column_name();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_column_name.add(column_name633.getTree());

            	    }
            	    break;

            	default :
            	    break loop205;
                }
            } while (true);


            RIGHT_PAREN634=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_multi_column_for_loop8983); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN634);


            pushFollow(FOLLOW_in_key_in_multi_column_for_loop8985);
            in_key635=gPLSQLParser.in_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_in_key.add(in_key635.getTree());

            LEFT_PAREN636=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_multi_column_for_loop8995); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN636);


            // PLSQL_DMLParser.g:942:13: ( ( select_key )=> subquery | ( LEFT_PAREN )=> LEFT_PAREN expression_list ( COMMA expression_list )* RIGHT_PAREN )
            int alt207=2;
            int LA207_0 = input.LA(1);

            if ( (LA207_0==SQL92_RESERVED_SELECT) && (synpred19_PLSQL_DMLParser())) {
                alt207=1;
            }
            else if ( (LA207_0==LEFT_PAREN) ) {
                int LA207_2 = input.LA(2);

                if ( (synpred19_PLSQL_DMLParser()) ) {
                    alt207=1;
                }
                else if ( (synpred20_PLSQL_DMLParser()) ) {
                    alt207=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 207, 2, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 207, 0, input);

                throw nvae;

            }
            switch (alt207) {
                case 1 :
                    // PLSQL_DMLParser.g:942:18: ( select_key )=> subquery
                    {
                    pushFollow(FOLLOW_subquery_in_multi_column_for_loop9019);
                    subquery637=subquery();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_subquery.add(subquery637.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:943:18: ( LEFT_PAREN )=> LEFT_PAREN expression_list ( COMMA expression_list )* RIGHT_PAREN
                    {
                    LEFT_PAREN638=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_multi_column_for_loop9043); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN638);


                    pushFollow(FOLLOW_expression_list_in_multi_column_for_loop9045);
                    expression_list639=expression_list();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_expression_list.add(expression_list639.getTree());

                    // PLSQL_DMLParser.g:943:60: ( COMMA expression_list )*
                    loop206:
                    do {
                        int alt206=2;
                        int LA206_0 = input.LA(1);

                        if ( (LA206_0==COMMA) ) {
                            alt206=1;
                        }


                        switch (alt206) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:943:61: COMMA expression_list
                    	    {
                    	    COMMA640=(Token)match(input,COMMA,FOLLOW_COMMA_in_multi_column_for_loop9048); if (state.failed) return retval; 
                    	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA640);


                    	    pushFollow(FOLLOW_expression_list_in_multi_column_for_loop9050);
                    	    expression_list641=expression_list();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) stream_expression_list.add(expression_list641.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop206;
                        }
                    } while (true);


                    RIGHT_PAREN642=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_multi_column_for_loop9054); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN642);


                    }
                    break;

            }


            RIGHT_PAREN643=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_multi_column_for_loop9078); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN643);


            // AST REWRITE
            // elements: expression_list, in_key, subquery, column_name
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 946:9: -> ^( FOR_MULTI_COLUMN[$for_key.start] ( column_name )+ ^( in_key ( subquery )? ( expression_list )* ) )
            {
                // PLSQL_DMLParser.g:946:12: ^( FOR_MULTI_COLUMN[$for_key.start] ( column_name )+ ^( in_key ( subquery )? ( expression_list )* ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(FOR_MULTI_COLUMN, (for_key629!=null?((Token)for_key629.start):null))
                , root_1);

                if ( !(stream_column_name.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_column_name.hasNext() ) {
                    adaptor.addChild(root_1, stream_column_name.nextTree());

                }
                stream_column_name.reset();

                // PLSQL_DMLParser.g:946:60: ^( in_key ( subquery )? ( expression_list )* )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_in_key.nextNode(), root_2);

                // PLSQL_DMLParser.g:946:69: ( subquery )?
                if ( stream_subquery.hasNext() ) {
                    adaptor.addChild(root_2, stream_subquery.nextTree());

                }
                stream_subquery.reset();

                // PLSQL_DMLParser.g:946:79: ( expression_list )*
                while ( stream_expression_list.hasNext() ) {
                    adaptor.addChild(root_2, stream_expression_list.nextTree());

                }
                stream_expression_list.reset();

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "multi_column_for_loop"


    public static class keep_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "keep_expression"
    // PLSQL_DMLParser.g:949:1: keep_expression : unary_expression ( keep_key ^ LEFT_PAREN ! dense_rank_key ( first_key | last_key ) order_by_clause RIGHT_PAREN ! ( over_clause )? )? ;
    public final PLSQLParser_PLSQL_DMLParser.keep_expression_return keep_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.keep_expression_return retval = new PLSQLParser_PLSQL_DMLParser.keep_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN646=null;
        Token RIGHT_PAREN651=null;
        PLSQLParser_PLSQL_DMLParser.unary_expression_return unary_expression644 =null;

        PLSQLParser_PLSQLKeys.keep_key_return keep_key645 =null;

        PLSQLParser_PLSQLKeys.dense_rank_key_return dense_rank_key647 =null;

        PLSQLParser_PLSQLKeys.first_key_return first_key648 =null;

        PLSQLParser_PLSQLKeys.last_key_return last_key649 =null;

        PLSQLParser_PLSQL_DMLParser.order_by_clause_return order_by_clause650 =null;

        PLSQLParser_PLSQL_DMLParser.over_clause_return over_clause652 =null;


        Object LEFT_PAREN646_tree=null;
        Object RIGHT_PAREN651_tree=null;

        try {
            // PLSQL_DMLParser.g:950:5: ( unary_expression ( keep_key ^ LEFT_PAREN ! dense_rank_key ( first_key | last_key ) order_by_clause RIGHT_PAREN ! ( over_clause )? )? )
            // PLSQL_DMLParser.g:950:10: unary_expression ( keep_key ^ LEFT_PAREN ! dense_rank_key ( first_key | last_key ) order_by_clause RIGHT_PAREN ! ( over_clause )? )?
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_unary_expression_in_keep_expression9126);
            unary_expression644=unary_expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, unary_expression644.getTree());

            // PLSQL_DMLParser.g:951:5: ( keep_key ^ LEFT_PAREN ! dense_rank_key ( first_key | last_key ) order_by_clause RIGHT_PAREN ! ( over_clause )? )?
            int alt210=2;
            int LA210_0 = input.LA(1);

            if ( (LA210_0==REGULAR_ID) ) {
                int LA210_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("keep"))) ) {
                    alt210=1;
                }
            }
            switch (alt210) {
                case 1 :
                    // PLSQL_DMLParser.g:951:10: keep_key ^ LEFT_PAREN ! dense_rank_key ( first_key | last_key ) order_by_clause RIGHT_PAREN ! ( over_clause )?
                    {
                    pushFollow(FOLLOW_keep_key_in_keep_expression9137);
                    keep_key645=gPLSQLParser.keep_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(keep_key645.getTree(), root_0);

                    LEFT_PAREN646=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_keep_expression9149); if (state.failed) return retval;

                    pushFollow(FOLLOW_dense_rank_key_in_keep_expression9165);
                    dense_rank_key647=gPLSQLParser.dense_rank_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, dense_rank_key647.getTree());

                    // PLSQL_DMLParser.g:953:28: ( first_key | last_key )
                    int alt208=2;
                    int LA208_0 = input.LA(1);

                    if ( (LA208_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("first"))||(input.LT(1).getText().equalsIgnoreCase("last"))))) {
                        int LA208_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("first"))) ) {
                            alt208=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("last"))) ) {
                            alt208=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 208, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 208, 0, input);

                        throw nvae;

                    }
                    switch (alt208) {
                        case 1 :
                            // PLSQL_DMLParser.g:953:29: first_key
                            {
                            pushFollow(FOLLOW_first_key_in_keep_expression9168);
                            first_key648=gPLSQLParser.first_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, first_key648.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:953:39: last_key
                            {
                            pushFollow(FOLLOW_last_key_in_keep_expression9170);
                            last_key649=gPLSQLParser.last_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, last_key649.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_order_by_clause_in_keep_expression9186);
                    order_by_clause650=order_by_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, order_by_clause650.getTree());

                    RIGHT_PAREN651=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_keep_expression9196); if (state.failed) return retval;

                    // PLSQL_DMLParser.g:955:22: ( over_clause )?
                    int alt209=2;
                    int LA209_0 = input.LA(1);

                    if ( (LA209_0==REGULAR_ID) ) {
                        int LA209_1 = input.LA(2);

                        if ( (LA209_1==LEFT_PAREN) ) {
                            int LA209_3 = input.LA(3);

                            if ( (LA209_3==REGULAR_ID) ) {
                                int LA209_10 = input.LA(4);

                                if ( (LA209_10==SQL92_RESERVED_BY) && ((input.LT(1).getText().equalsIgnoreCase("over")))) {
                                    alt209=1;
                                }
                            }
                            else if ( (LA209_3==RIGHT_PAREN||LA209_3==SQL92_RESERVED_ORDER) && ((input.LT(1).getText().equalsIgnoreCase("over")))) {
                                alt209=1;
                            }
                        }
                    }
                    switch (alt209) {
                        case 1 :
                            // PLSQL_DMLParser.g:955:22: over_clause
                            {
                            pushFollow(FOLLOW_over_clause_in_keep_expression9199);
                            over_clause652=over_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, over_clause652.getTree());

                            }
                            break;

                    }


                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "keep_expression"


    public static class unary_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "unary_expression"
    // PLSQL_DMLParser.g:958:1: unary_expression : ( MINUS_SIGN unary_expression -> ^( UNARY_OPERATOR[$MINUS_SIGN] unary_expression ) | PLUS_SIGN unary_expression -> ^( UNARY_OPERATOR[$PLUS_SIGN] unary_expression ) | prior_key ^ unary_expression |{...}? => new_key ^ unary_expression | distinct_key ^ unary_expression | all_key ^ unary_expression |{...}? case_statement[false] | quantified_expression | standard_function -> ^( STANDARD_FUNCTION standard_function ) | atom );
    public final PLSQLParser_PLSQL_DMLParser.unary_expression_return unary_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.unary_expression_return retval = new PLSQLParser_PLSQL_DMLParser.unary_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token MINUS_SIGN653=null;
        Token PLUS_SIGN655=null;
        PLSQLParser_PLSQL_DMLParser.unary_expression_return unary_expression654 =null;

        PLSQLParser_PLSQL_DMLParser.unary_expression_return unary_expression656 =null;

        PLSQLParser_PLSQLKeys.prior_key_return prior_key657 =null;

        PLSQLParser_PLSQL_DMLParser.unary_expression_return unary_expression658 =null;

        PLSQLParser_PLSQLKeys.new_key_return new_key659 =null;

        PLSQLParser_PLSQL_DMLParser.unary_expression_return unary_expression660 =null;

        PLSQLParser_PLSQLKeys.distinct_key_return distinct_key661 =null;

        PLSQLParser_PLSQL_DMLParser.unary_expression_return unary_expression662 =null;

        PLSQLParser_PLSQLKeys.all_key_return all_key663 =null;

        PLSQLParser_PLSQL_DMLParser.unary_expression_return unary_expression664 =null;

        PLSQLParser_PLSQL_DMLParser.case_statement_return case_statement665 =null;

        PLSQLParser_PLSQL_DMLParser.quantified_expression_return quantified_expression666 =null;

        PLSQLParser_PLSQL_DMLParser.standard_function_return standard_function667 =null;

        PLSQLParser_PLSQL_DMLParser.atom_return atom668 =null;


        Object MINUS_SIGN653_tree=null;
        Object PLUS_SIGN655_tree=null;
        RewriteRuleTokenStream stream_PLUS_SIGN=new RewriteRuleTokenStream(adaptor,"token PLUS_SIGN");
        RewriteRuleTokenStream stream_MINUS_SIGN=new RewriteRuleTokenStream(adaptor,"token MINUS_SIGN");
        RewriteRuleSubtreeStream stream_unary_expression=new RewriteRuleSubtreeStream(adaptor,"rule unary_expression");
        RewriteRuleSubtreeStream stream_standard_function=new RewriteRuleSubtreeStream(adaptor,"rule standard_function");
        try {
            // PLSQL_DMLParser.g:959:5: ( MINUS_SIGN unary_expression -> ^( UNARY_OPERATOR[$MINUS_SIGN] unary_expression ) | PLUS_SIGN unary_expression -> ^( UNARY_OPERATOR[$PLUS_SIGN] unary_expression ) | prior_key ^ unary_expression |{...}? => new_key ^ unary_expression | distinct_key ^ unary_expression | all_key ^ unary_expression |{...}? case_statement[false] | quantified_expression | standard_function -> ^( STANDARD_FUNCTION standard_function ) | atom )
            int alt211=10;
            switch ( input.LA(1) ) {
            case MINUS_SIGN:
                {
                alt211=1;
                }
                break;
            case PLUS_SIGN:
                {
                alt211=2;
                }
                break;
            case SQL92_RESERVED_PRIOR:
                {
                alt211=3;
                }
                break;
            case REGULAR_ID:
                {
                int LA211_4 = input.LA(2);

                if ( ((((input.LT(1).getText().equalsIgnoreCase("new") && !input.LT(2).getText().equals("."))&&(input.LT(1).getText().equalsIgnoreCase("new") && !input.LT(2).getText().equals(".")))&&(input.LT(1).getText().equalsIgnoreCase("new")))) ) {
                    alt211=4;
                }
                else if ( (((input.LA(1) == SQL92_RESERVED_CASE || input.LA(2) == SQL92_RESERVED_CASE))) ) {
                    alt211=7;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("some"))) ) {
                    alt211=8;
                }
                else if ( (((input.LT(1).getText().equalsIgnoreCase("xmlelement"))||(input.LT(1).getText().equalsIgnoreCase("xmlcolattval"))||(input.LT(1).getText().equalsIgnoreCase("last_value"))||(input.LT(1).getText().equalsIgnoreCase("xmlforest"))||(input.LT(1).getText().equalsIgnoreCase("cast"))||(input.LT(1).getText().equalsIgnoreCase("xmlparse"))||(input.LT(1).getText().equalsIgnoreCase("xmlroot"))||(input.LT(1).getText().equalsIgnoreCase("xmltable"))||(enablesUsingClause(input.LT(1).getText()))||(input.LT(1).getText().equalsIgnoreCase("trim"))||(input.LT(1).getText().equalsIgnoreCase("decompose"))||(input.LT(1).getText().equalsIgnoreCase("xmlcast"))||(input.LT(1).getText().equalsIgnoreCase("xmlquery"))||(input.LT(1).getText().equalsIgnoreCase("xmlpi"))||(input.LT(1).getText().equalsIgnoreCase("treat"))||(input.LT(1).getText().equalsIgnoreCase("extract"))||(input.LT(1).getText().equalsIgnoreCase("xmlexists"))||(enablesOverClause(input.LT(1).getText()))||(input.LT(1).getText().equalsIgnoreCase("xmlagg"))||(input.LT(1).getText().equalsIgnoreCase("chr"))||(isStandardPredictionFunction(input.LT(1).getText()))||(input.LT(1).getText().equalsIgnoreCase("count"))||(enablesWithinOrOverClause(input.LT(1).getText()))||(input.LT(1).getText().equalsIgnoreCase("translate"))||(input.LT(1).getText().equalsIgnoreCase("xmlserialize"))||(input.LT(1).getText().equalsIgnoreCase("first_value"))||(input.LT(1).getText().equalsIgnoreCase("collect")))) ) {
                    alt211=9;
                }
                else if ( (true) ) {
                    alt211=10;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 211, 4, input);

                    throw nvae;

                }
                }
                break;
            case SQL92_RESERVED_DISTINCT:
                {
                alt211=5;
                }
                break;
            case SQL92_RESERVED_ALL:
                {
                alt211=6;
                }
                break;
            case DELIMITED_ID:
                {
                int LA211_7 = input.LA(2);

                if ( (((input.LA(1) == SQL92_RESERVED_CASE || input.LA(2) == SQL92_RESERVED_CASE))) ) {
                    alt211=7;
                }
                else if ( (true) ) {
                    alt211=10;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 211, 7, input);

                    throw nvae;

                }
                }
                break;
            case SQL92_RESERVED_CASE:
                {
                alt211=7;
                }
                break;
            case SQL92_RESERVED_ANY:
            case SQL92_RESERVED_EXISTS:
                {
                alt211=8;
                }
                break;
            case APPROXIMATE_NUM_LIT:
            case CHAR_STRING:
            case COLON:
            case EXACT_NUM_LIT:
            case INTRODUCER:
            case LEFT_PAREN:
            case SQL92_RESERVED_DEFAULT:
            case SQL92_RESERVED_FALSE:
            case SQL92_RESERVED_NULL:
            case SQL92_RESERVED_TRUE:
            case UNSIGNED_INTEGER:
                {
                alt211=10;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 211, 0, input);

                throw nvae;

            }

            switch (alt211) {
                case 1 :
                    // PLSQL_DMLParser.g:959:10: MINUS_SIGN unary_expression
                    {
                    MINUS_SIGN653=(Token)match(input,MINUS_SIGN,FOLLOW_MINUS_SIGN_in_unary_expression9226); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_MINUS_SIGN.add(MINUS_SIGN653);


                    pushFollow(FOLLOW_unary_expression_in_unary_expression9228);
                    unary_expression654=unary_expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_unary_expression.add(unary_expression654.getTree());

                    // AST REWRITE
                    // elements: unary_expression
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 959:38: -> ^( UNARY_OPERATOR[$MINUS_SIGN] unary_expression )
                    {
                        // PLSQL_DMLParser.g:959:41: ^( UNARY_OPERATOR[$MINUS_SIGN] unary_expression )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(UNARY_OPERATOR, MINUS_SIGN653)
                        , root_1);

                        adaptor.addChild(root_1, stream_unary_expression.nextTree());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:960:10: PLUS_SIGN unary_expression
                    {
                    PLUS_SIGN655=(Token)match(input,PLUS_SIGN,FOLLOW_PLUS_SIGN_in_unary_expression9248); if (state.failed) return retval; 
                    if ( state.backtracking==0 ) stream_PLUS_SIGN.add(PLUS_SIGN655);


                    pushFollow(FOLLOW_unary_expression_in_unary_expression9250);
                    unary_expression656=unary_expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_unary_expression.add(unary_expression656.getTree());

                    // AST REWRITE
                    // elements: unary_expression
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 960:37: -> ^( UNARY_OPERATOR[$PLUS_SIGN] unary_expression )
                    {
                        // PLSQL_DMLParser.g:960:40: ^( UNARY_OPERATOR[$PLUS_SIGN] unary_expression )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(UNARY_OPERATOR, PLUS_SIGN655)
                        , root_1);

                        adaptor.addChild(root_1, stream_unary_expression.nextTree());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:961:10: prior_key ^ unary_expression
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_prior_key_in_unary_expression9270);
                    prior_key657=gPLSQLParser.prior_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(prior_key657.getTree(), root_0);

                    pushFollow(FOLLOW_unary_expression_in_unary_expression9273);
                    unary_expression658=unary_expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, unary_expression658.getTree());

                    }
                    break;
                case 4 :
                    // PLSQL_DMLParser.g:962:10: {...}? => new_key ^ unary_expression
                    {
                    root_0 = (Object)adaptor.nil();


                    if ( !((input.LT(1).getText().equalsIgnoreCase("new") && !input.LT(2).getText().equals("."))) ) {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        throw new FailedPredicateException(input, "unary_expression", "input.LT(1).getText().equalsIgnoreCase(\"new\") && !input.LT(2).getText().equals(\".\")");
                    }

                    pushFollow(FOLLOW_new_key_in_unary_expression9287);
                    new_key659=gPLSQLParser.new_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(new_key659.getTree(), root_0);

                    pushFollow(FOLLOW_unary_expression_in_unary_expression9290);
                    unary_expression660=unary_expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, unary_expression660.getTree());

                    }
                    break;
                case 5 :
                    // PLSQL_DMLParser.g:963:10: distinct_key ^ unary_expression
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_distinct_key_in_unary_expression9301);
                    distinct_key661=gPLSQLParser.distinct_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(distinct_key661.getTree(), root_0);

                    pushFollow(FOLLOW_unary_expression_in_unary_expression9304);
                    unary_expression662=unary_expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, unary_expression662.getTree());

                    }
                    break;
                case 6 :
                    // PLSQL_DMLParser.g:964:10: all_key ^ unary_expression
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_all_key_in_unary_expression9315);
                    all_key663=gPLSQLParser.all_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(all_key663.getTree(), root_0);

                    pushFollow(FOLLOW_unary_expression_in_unary_expression9318);
                    unary_expression664=unary_expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, unary_expression664.getTree());

                    }
                    break;
                case 7 :
                    // PLSQL_DMLParser.g:965:10: {...}? case_statement[false]
                    {
                    root_0 = (Object)adaptor.nil();


                    if ( !(((input.LA(1) == SQL92_RESERVED_CASE || input.LA(2) == SQL92_RESERVED_CASE))) ) {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        throw new FailedPredicateException(input, "unary_expression", "(input.LA(1) == SQL92_RESERVED_CASE || input.LA(2) == SQL92_RESERVED_CASE)");
                    }

                    pushFollow(FOLLOW_case_statement_in_unary_expression9331);
                    case_statement665=case_statement(false);

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, case_statement665.getTree());

                    }
                    break;
                case 8 :
                    // PLSQL_DMLParser.g:966:10: quantified_expression
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_quantified_expression_in_unary_expression9343);
                    quantified_expression666=quantified_expression();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, quantified_expression666.getTree());

                    }
                    break;
                case 9 :
                    // PLSQL_DMLParser.g:967:10: standard_function
                    {
                    pushFollow(FOLLOW_standard_function_in_unary_expression9354);
                    standard_function667=standard_function();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_standard_function.add(standard_function667.getTree());

                    // AST REWRITE
                    // elements: standard_function
                    // token labels: 
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    if ( state.backtracking==0 ) {

                    retval.tree = root_0;
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (Object)adaptor.nil();
                    // 967:28: -> ^( STANDARD_FUNCTION standard_function )
                    {
                        // PLSQL_DMLParser.g:967:31: ^( STANDARD_FUNCTION standard_function )
                        {
                        Object root_1 = (Object)adaptor.nil();
                        root_1 = (Object)adaptor.becomeRoot(
                        (Object)adaptor.create(STANDARD_FUNCTION, "STANDARD_FUNCTION")
                        , root_1);

                        adaptor.addChild(root_1, stream_standard_function.nextTree());

                        adaptor.addChild(root_0, root_1);
                        }

                    }


                    retval.tree = root_0;
                    }

                    }
                    break;
                case 10 :
                    // PLSQL_DMLParser.g:968:10: atom
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_atom_in_unary_expression9373);
                    atom668=atom();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, atom668.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "unary_expression"


    protected static class case_statement_scope {
        boolean isStatement;
    }
    protected Stack case_statement_stack = new Stack();


    public static class case_statement_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "case_statement"
    // PLSQL_DMLParser.g:971:1: case_statement[boolean isStatementParameter] : ( ( ( label_name )? case_key when_key )=> searched_case_statement | simple_case_statement );
    public final PLSQLParser_PLSQL_DMLParser.case_statement_return case_statement(boolean isStatementParameter) throws RecognitionException {
        case_statement_stack.push(new case_statement_scope());
        PLSQLParser_PLSQL_DMLParser.case_statement_return retval = new PLSQLParser_PLSQL_DMLParser.case_statement_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.searched_case_statement_return searched_case_statement669 =null;

        PLSQLParser_PLSQL_DMLParser.simple_case_statement_return simple_case_statement670 =null;



        ((case_statement_scope)case_statement_stack.peek()).isStatement = isStatementParameter;
        try {
            // PLSQL_DMLParser.g:976:5: ( ( ( label_name )? case_key when_key )=> searched_case_statement | simple_case_statement )
            int alt212=2;
            switch ( input.LA(1) ) {
            case REGULAR_ID:
                {
                int LA212_1 = input.LA(2);

                if ( (LA212_1==SQL92_RESERVED_CASE) ) {
                    int LA212_3 = input.LA(3);

                    if ( (LA212_3==SQL92_RESERVED_WHEN) && (synpred21_PLSQL_DMLParser())) {
                        alt212=1;
                    }
                    else if ( (LA212_3==APPROXIMATE_NUM_LIT||(LA212_3 >= CHAR_STRING && LA212_3 <= COLON)||LA212_3==DELIMITED_ID||LA212_3==EXACT_NUM_LIT||LA212_3==INTRODUCER||LA212_3==LEFT_PAREN||LA212_3==REGULAR_ID||LA212_3==SQL92_RESERVED_DEFAULT||LA212_3==SQL92_RESERVED_FALSE||LA212_3==SQL92_RESERVED_NULL||LA212_3==SQL92_RESERVED_TRUE||LA212_3==UNSIGNED_INTEGER) ) {
                        alt212=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 212, 3, input);

                        throw nvae;

                    }
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 212, 1, input);

                    throw nvae;

                }
                }
                break;
            case DELIMITED_ID:
                {
                int LA212_2 = input.LA(2);

                if ( (LA212_2==SQL92_RESERVED_CASE) ) {
                    int LA212_3 = input.LA(3);

                    if ( (LA212_3==SQL92_RESERVED_WHEN) && (synpred21_PLSQL_DMLParser())) {
                        alt212=1;
                    }
                    else if ( (LA212_3==APPROXIMATE_NUM_LIT||(LA212_3 >= CHAR_STRING && LA212_3 <= COLON)||LA212_3==DELIMITED_ID||LA212_3==EXACT_NUM_LIT||LA212_3==INTRODUCER||LA212_3==LEFT_PAREN||LA212_3==REGULAR_ID||LA212_3==SQL92_RESERVED_DEFAULT||LA212_3==SQL92_RESERVED_FALSE||LA212_3==SQL92_RESERVED_NULL||LA212_3==SQL92_RESERVED_TRUE||LA212_3==UNSIGNED_INTEGER) ) {
                        alt212=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 212, 3, input);

                        throw nvae;

                    }
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 212, 2, input);

                    throw nvae;

                }
                }
                break;
            case SQL92_RESERVED_CASE:
                {
                int LA212_3 = input.LA(2);

                if ( (LA212_3==SQL92_RESERVED_WHEN) && (synpred21_PLSQL_DMLParser())) {
                    alt212=1;
                }
                else if ( (LA212_3==APPROXIMATE_NUM_LIT||(LA212_3 >= CHAR_STRING && LA212_3 <= COLON)||LA212_3==DELIMITED_ID||LA212_3==EXACT_NUM_LIT||LA212_3==INTRODUCER||LA212_3==LEFT_PAREN||LA212_3==REGULAR_ID||LA212_3==SQL92_RESERVED_DEFAULT||LA212_3==SQL92_RESERVED_FALSE||LA212_3==SQL92_RESERVED_NULL||LA212_3==SQL92_RESERVED_TRUE||LA212_3==UNSIGNED_INTEGER) ) {
                    alt212=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 212, 3, input);

                    throw nvae;

                }
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 212, 0, input);

                throw nvae;

            }

            switch (alt212) {
                case 1 :
                    // PLSQL_DMLParser.g:976:10: ( ( label_name )? case_key when_key )=> searched_case_statement
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_searched_case_statement_in_case_statement9420);
                    searched_case_statement669=searched_case_statement();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, searched_case_statement669.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:977:10: simple_case_statement
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_simple_case_statement_in_case_statement9431);
                    simple_case_statement670=simple_case_statement();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, simple_case_statement670.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
            case_statement_stack.pop();
        }
        return retval;
    }
    // $ANTLR end "case_statement"


    public static class simple_case_statement_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "simple_case_statement"
    // PLSQL_DMLParser.g:982:1: simple_case_statement : ( label_name )? ck1= case_key atom ( simple_case_when_part )+ ( case_else_part )? end_key ( case_key )? ( label_name )? -> ^( SIMPLE_CASE[$ck1.start] ( label_name )* ^( EXPR atom ) ( simple_case_when_part )+ ( case_else_part )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.simple_case_statement_return simple_case_statement() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.simple_case_statement_return retval = new PLSQLParser_PLSQL_DMLParser.simple_case_statement_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.case_key_return ck1 =null;

        PLSQLParser_PLSQLCommons.label_name_return label_name671 =null;

        PLSQLParser_PLSQL_DMLParser.atom_return atom672 =null;

        PLSQLParser_PLSQL_DMLParser.simple_case_when_part_return simple_case_when_part673 =null;

        PLSQLParser_PLSQL_DMLParser.case_else_part_return case_else_part674 =null;

        PLSQLParser_PLSQLKeys.end_key_return end_key675 =null;

        PLSQLParser_PLSQLKeys.case_key_return case_key676 =null;

        PLSQLParser_PLSQLCommons.label_name_return label_name677 =null;


        RewriteRuleSubtreeStream stream_atom=new RewriteRuleSubtreeStream(adaptor,"rule atom");
        RewriteRuleSubtreeStream stream_simple_case_when_part=new RewriteRuleSubtreeStream(adaptor,"rule simple_case_when_part");
        RewriteRuleSubtreeStream stream_label_name=new RewriteRuleSubtreeStream(adaptor,"rule label_name");
        RewriteRuleSubtreeStream stream_case_else_part=new RewriteRuleSubtreeStream(adaptor,"rule case_else_part");
        RewriteRuleSubtreeStream stream_case_key=new RewriteRuleSubtreeStream(adaptor,"rule case_key");
        RewriteRuleSubtreeStream stream_end_key=new RewriteRuleSubtreeStream(adaptor,"rule end_key");
        try {
            // PLSQL_DMLParser.g:983:5: ( ( label_name )? ck1= case_key atom ( simple_case_when_part )+ ( case_else_part )? end_key ( case_key )? ( label_name )? -> ^( SIMPLE_CASE[$ck1.start] ( label_name )* ^( EXPR atom ) ( simple_case_when_part )+ ( case_else_part )? ) )
            // PLSQL_DMLParser.g:983:10: ( label_name )? ck1= case_key atom ( simple_case_when_part )+ ( case_else_part )? end_key ( case_key )? ( label_name )?
            {
            // PLSQL_DMLParser.g:983:10: ( label_name )?
            int alt213=2;
            int LA213_0 = input.LA(1);

            if ( (LA213_0==DELIMITED_ID||LA213_0==REGULAR_ID) ) {
                alt213=1;
            }
            switch (alt213) {
                case 1 :
                    // PLSQL_DMLParser.g:983:10: label_name
                    {
                    pushFollow(FOLLOW_label_name_in_simple_case_statement9453);
                    label_name671=gPLSQLParser.label_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_label_name.add(label_name671.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_case_key_in_simple_case_statement9458);
            ck1=gPLSQLParser.case_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_case_key.add(ck1.getTree());

            pushFollow(FOLLOW_atom_in_simple_case_statement9460);
            atom672=atom();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_atom.add(atom672.getTree());

            // PLSQL_DMLParser.g:984:9: ( simple_case_when_part )+
            int cnt214=0;
            loop214:
            do {
                int alt214=2;
                int LA214_0 = input.LA(1);

                if ( (LA214_0==SQL92_RESERVED_WHEN) ) {
                    alt214=1;
                }


                switch (alt214) {
            	case 1 :
            	    // PLSQL_DMLParser.g:984:9: simple_case_when_part
            	    {
            	    pushFollow(FOLLOW_simple_case_when_part_in_simple_case_statement9470);
            	    simple_case_when_part673=simple_case_when_part();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_simple_case_when_part.add(simple_case_when_part673.getTree());

            	    }
            	    break;

            	default :
            	    if ( cnt214 >= 1 ) break loop214;
            	    if (state.backtracking>0) {state.failed=true; return retval;}
                        EarlyExitException eee =
                            new EarlyExitException(214, input);
                        throw eee;
                }
                cnt214++;
            } while (true);


            // PLSQL_DMLParser.g:985:9: ( case_else_part )?
            int alt215=2;
            int LA215_0 = input.LA(1);

            if ( (LA215_0==SQL92_RESERVED_ELSE) ) {
                alt215=1;
            }
            switch (alt215) {
                case 1 :
                    // PLSQL_DMLParser.g:985:9: case_else_part
                    {
                    pushFollow(FOLLOW_case_else_part_in_simple_case_statement9482);
                    case_else_part674=case_else_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_case_else_part.add(case_else_part674.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_end_key_in_simple_case_statement9493);
            end_key675=gPLSQLParser.end_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_end_key.add(end_key675.getTree());

            // PLSQL_DMLParser.g:986:17: ( case_key )?
            int alt216=2;
            int LA216_0 = input.LA(1);

            if ( (LA216_0==SQL92_RESERVED_CASE) ) {
                alt216=1;
            }
            switch (alt216) {
                case 1 :
                    // PLSQL_DMLParser.g:986:17: case_key
                    {
                    pushFollow(FOLLOW_case_key_in_simple_case_statement9495);
                    case_key676=gPLSQLParser.case_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_case_key.add(case_key676.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:986:27: ( label_name )?
            int alt217=2;
            int LA217_0 = input.LA(1);

            if ( (LA217_0==REGULAR_ID) ) {
                alt217=1;
            }
            else if ( (LA217_0==DELIMITED_ID) ) {
                alt217=1;
            }
            switch (alt217) {
                case 1 :
                    // PLSQL_DMLParser.g:986:27: label_name
                    {
                    pushFollow(FOLLOW_label_name_in_simple_case_statement9498);
                    label_name677=gPLSQLParser.label_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_label_name.add(label_name677.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: simple_case_when_part, label_name, case_else_part, atom
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 987:9: -> ^( SIMPLE_CASE[$ck1.start] ( label_name )* ^( EXPR atom ) ( simple_case_when_part )+ ( case_else_part )? )
            {
                // PLSQL_DMLParser.g:987:12: ^( SIMPLE_CASE[$ck1.start] ( label_name )* ^( EXPR atom ) ( simple_case_when_part )+ ( case_else_part )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(SIMPLE_CASE, (ck1!=null?((Token)ck1.start):null))
                , root_1);

                // PLSQL_DMLParser.g:987:38: ( label_name )*
                while ( stream_label_name.hasNext() ) {
                    adaptor.addChild(root_1, stream_label_name.nextTree());

                }
                stream_label_name.reset();

                // PLSQL_DMLParser.g:987:50: ^( EXPR atom )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_atom.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                if ( !(stream_simple_case_when_part.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_simple_case_when_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_simple_case_when_part.nextTree());

                }
                stream_simple_case_when_part.reset();

                // PLSQL_DMLParser.g:987:86: ( case_else_part )?
                if ( stream_case_else_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_case_else_part.nextTree());

                }
                stream_case_else_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "simple_case_statement"


    public static class simple_case_when_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "simple_case_when_part"
    // PLSQL_DMLParser.g:990:1: simple_case_when_part : when_key ^ew1= expression_wrapper then_key ! ({...}? seq_of_statements |ew2= expression_wrapper ) ;
    public final PLSQLParser_PLSQL_DMLParser.simple_case_when_part_return simple_case_when_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.simple_case_when_part_return retval = new PLSQLParser_PLSQL_DMLParser.simple_case_when_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return ew1 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return ew2 =null;

        PLSQLParser_PLSQLKeys.when_key_return when_key678 =null;

        PLSQLParser_PLSQLKeys.then_key_return then_key679 =null;

        PLSQLParser_PLSQL_DMLParser.seq_of_statements_return seq_of_statements680 =null;



        try {
            // PLSQL_DMLParser.g:991:5: ( when_key ^ew1= expression_wrapper then_key ! ({...}? seq_of_statements |ew2= expression_wrapper ) )
            // PLSQL_DMLParser.g:991:10: when_key ^ew1= expression_wrapper then_key ! ({...}? seq_of_statements |ew2= expression_wrapper )
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_when_key_in_simple_case_when_part9551);
            when_key678=gPLSQLParser.when_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(when_key678.getTree(), root_0);

            pushFollow(FOLLOW_expression_wrapper_in_simple_case_when_part9556);
            ew1=expression_wrapper();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, ew1.getTree());

            pushFollow(FOLLOW_then_key_in_simple_case_when_part9558);
            then_key679=gPLSQLParser.then_key();

            state._fsp--;
            if (state.failed) return retval;

            // PLSQL_DMLParser.g:991:53: ({...}? seq_of_statements |ew2= expression_wrapper )
            int alt218=2;
            switch ( input.LA(1) ) {
            case PLSQL_RESERVED_LOCK:
            case SQL92_RESERVED_DELETE:
            case SQL92_RESERVED_INSERT:
            case SQL92_RESERVED_SELECT:
            case SQL92_RESERVED_UPDATE:
            case SQL92_RESERVED_WITH:
                {
                alt218=1;
                }
                break;
            case LEFT_PAREN:
                {
                int LA218_3 = input.LA(2);

                if ( ((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                    alt218=1;
                }
                else if ( (true) ) {
                    alt218=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 218, 3, input);

                    throw nvae;

                }
                }
                break;
            case REGULAR_ID:
                {
                int LA218_8 = input.LA(2);

                if ( ((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                    alt218=1;
                }
                else if ( (true) ) {
                    alt218=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 218, 8, input);

                    throw nvae;

                }
                }
                break;
            case DELIMITED_ID:
                {
                int LA218_9 = input.LA(2);

                if ( ((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                    alt218=1;
                }
                else if ( (true) ) {
                    alt218=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 218, 9, input);

                    throw nvae;

                }
                }
                break;
            case SQL92_RESERVED_CASE:
                {
                int LA218_10 = input.LA(2);

                if ( ((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                    alt218=1;
                }
                else if ( (((input.LA(1) == SQL92_RESERVED_CASE || input.LA(2) == SQL92_RESERVED_CASE))) ) {
                    alt218=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 218, 10, input);

                    throw nvae;

                }
                }
                break;
            case APPROXIMATE_NUM_LIT:
            case CHAR_STRING:
            case COLON:
            case EXACT_NUM_LIT:
            case INTRODUCER:
            case MINUS_SIGN:
            case PLUS_SIGN:
            case SQL92_RESERVED_ALL:
            case SQL92_RESERVED_ANY:
            case SQL92_RESERVED_DEFAULT:
            case SQL92_RESERVED_DISTINCT:
            case SQL92_RESERVED_EXISTS:
            case SQL92_RESERVED_FALSE:
            case SQL92_RESERVED_NOT:
            case SQL92_RESERVED_NULL:
            case SQL92_RESERVED_PRIOR:
            case SQL92_RESERVED_TRUE:
            case UNSIGNED_INTEGER:
                {
                alt218=2;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 218, 0, input);

                throw nvae;

            }

            switch (alt218) {
                case 1 :
                    // PLSQL_DMLParser.g:991:54: {...}? seq_of_statements
                    {
                    if ( !((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        throw new FailedPredicateException(input, "simple_case_when_part", "$case_statement::isStatement");
                    }

                    pushFollow(FOLLOW_seq_of_statements_in_simple_case_when_part9564);
                    seq_of_statements680=seq_of_statements();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, seq_of_statements680.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:991:106: ew2= expression_wrapper
                    {
                    pushFollow(FOLLOW_expression_wrapper_in_simple_case_when_part9570);
                    ew2=expression_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, ew2.getTree());

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "simple_case_when_part"


    public static class searched_case_statement_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "searched_case_statement"
    // PLSQL_DMLParser.g:994:1: searched_case_statement : ( label_name )? ck1= case_key ( searched_case_when_part )+ ( case_else_part )? end_key ( case_key )? ( label_name )? -> ^( SEARCHED_CASE[$ck1.start] ( label_name )* ( searched_case_when_part )+ ( case_else_part )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.searched_case_statement_return searched_case_statement() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.searched_case_statement_return retval = new PLSQLParser_PLSQL_DMLParser.searched_case_statement_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.case_key_return ck1 =null;

        PLSQLParser_PLSQLCommons.label_name_return label_name681 =null;

        PLSQLParser_PLSQL_DMLParser.searched_case_when_part_return searched_case_when_part682 =null;

        PLSQLParser_PLSQL_DMLParser.case_else_part_return case_else_part683 =null;

        PLSQLParser_PLSQLKeys.end_key_return end_key684 =null;

        PLSQLParser_PLSQLKeys.case_key_return case_key685 =null;

        PLSQLParser_PLSQLCommons.label_name_return label_name686 =null;


        RewriteRuleSubtreeStream stream_searched_case_when_part=new RewriteRuleSubtreeStream(adaptor,"rule searched_case_when_part");
        RewriteRuleSubtreeStream stream_label_name=new RewriteRuleSubtreeStream(adaptor,"rule label_name");
        RewriteRuleSubtreeStream stream_case_else_part=new RewriteRuleSubtreeStream(adaptor,"rule case_else_part");
        RewriteRuleSubtreeStream stream_case_key=new RewriteRuleSubtreeStream(adaptor,"rule case_key");
        RewriteRuleSubtreeStream stream_end_key=new RewriteRuleSubtreeStream(adaptor,"rule end_key");
        try {
            // PLSQL_DMLParser.g:995:5: ( ( label_name )? ck1= case_key ( searched_case_when_part )+ ( case_else_part )? end_key ( case_key )? ( label_name )? -> ^( SEARCHED_CASE[$ck1.start] ( label_name )* ( searched_case_when_part )+ ( case_else_part )? ) )
            // PLSQL_DMLParser.g:995:10: ( label_name )? ck1= case_key ( searched_case_when_part )+ ( case_else_part )? end_key ( case_key )? ( label_name )?
            {
            // PLSQL_DMLParser.g:995:10: ( label_name )?
            int alt219=2;
            int LA219_0 = input.LA(1);

            if ( (LA219_0==DELIMITED_ID||LA219_0==REGULAR_ID) ) {
                alt219=1;
            }
            switch (alt219) {
                case 1 :
                    // PLSQL_DMLParser.g:995:10: label_name
                    {
                    pushFollow(FOLLOW_label_name_in_searched_case_statement9591);
                    label_name681=gPLSQLParser.label_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_label_name.add(label_name681.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_case_key_in_searched_case_statement9596);
            ck1=gPLSQLParser.case_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_case_key.add(ck1.getTree());

            // PLSQL_DMLParser.g:996:9: ( searched_case_when_part )+
            int cnt220=0;
            loop220:
            do {
                int alt220=2;
                int LA220_0 = input.LA(1);

                if ( (LA220_0==SQL92_RESERVED_WHEN) ) {
                    alt220=1;
                }


                switch (alt220) {
            	case 1 :
            	    // PLSQL_DMLParser.g:996:9: searched_case_when_part
            	    {
            	    pushFollow(FOLLOW_searched_case_when_part_in_searched_case_statement9606);
            	    searched_case_when_part682=searched_case_when_part();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_searched_case_when_part.add(searched_case_when_part682.getTree());

            	    }
            	    break;

            	default :
            	    if ( cnt220 >= 1 ) break loop220;
            	    if (state.backtracking>0) {state.failed=true; return retval;}
                        EarlyExitException eee =
                            new EarlyExitException(220, input);
                        throw eee;
                }
                cnt220++;
            } while (true);


            // PLSQL_DMLParser.g:997:9: ( case_else_part )?
            int alt221=2;
            int LA221_0 = input.LA(1);

            if ( (LA221_0==SQL92_RESERVED_ELSE) ) {
                alt221=1;
            }
            switch (alt221) {
                case 1 :
                    // PLSQL_DMLParser.g:997:9: case_else_part
                    {
                    pushFollow(FOLLOW_case_else_part_in_searched_case_statement9617);
                    case_else_part683=case_else_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_case_else_part.add(case_else_part683.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_end_key_in_searched_case_statement9628);
            end_key684=gPLSQLParser.end_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_end_key.add(end_key684.getTree());

            // PLSQL_DMLParser.g:998:17: ( case_key )?
            int alt222=2;
            int LA222_0 = input.LA(1);

            if ( (LA222_0==SQL92_RESERVED_CASE) ) {
                alt222=1;
            }
            switch (alt222) {
                case 1 :
                    // PLSQL_DMLParser.g:998:17: case_key
                    {
                    pushFollow(FOLLOW_case_key_in_searched_case_statement9630);
                    case_key685=gPLSQLParser.case_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_case_key.add(case_key685.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:998:27: ( label_name )?
            int alt223=2;
            int LA223_0 = input.LA(1);

            if ( (LA223_0==REGULAR_ID) ) {
                alt223=1;
            }
            else if ( (LA223_0==DELIMITED_ID) ) {
                alt223=1;
            }
            switch (alt223) {
                case 1 :
                    // PLSQL_DMLParser.g:998:27: label_name
                    {
                    pushFollow(FOLLOW_label_name_in_searched_case_statement9633);
                    label_name686=gPLSQLParser.label_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_label_name.add(label_name686.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: label_name, searched_case_when_part, case_else_part
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 999:9: -> ^( SEARCHED_CASE[$ck1.start] ( label_name )* ( searched_case_when_part )+ ( case_else_part )? )
            {
                // PLSQL_DMLParser.g:999:12: ^( SEARCHED_CASE[$ck1.start] ( label_name )* ( searched_case_when_part )+ ( case_else_part )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(SEARCHED_CASE, (ck1!=null?((Token)ck1.start):null))
                , root_1);

                // PLSQL_DMLParser.g:999:40: ( label_name )*
                while ( stream_label_name.hasNext() ) {
                    adaptor.addChild(root_1, stream_label_name.nextTree());

                }
                stream_label_name.reset();

                if ( !(stream_searched_case_when_part.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_searched_case_when_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_searched_case_when_part.nextTree());

                }
                stream_searched_case_when_part.reset();

                // PLSQL_DMLParser.g:999:77: ( case_else_part )?
                if ( stream_case_else_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_case_else_part.nextTree());

                }
                stream_case_else_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "searched_case_statement"


    public static class searched_case_when_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "searched_case_when_part"
    // PLSQL_DMLParser.g:1002:1: searched_case_when_part : when_key ^ condition_wrapper then_key ! ({...}? seq_of_statements | expression_wrapper ) ;
    public final PLSQLParser_PLSQL_DMLParser.searched_case_when_part_return searched_case_when_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.searched_case_when_part_return retval = new PLSQLParser_PLSQL_DMLParser.searched_case_when_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.when_key_return when_key687 =null;

        PLSQLParser_PLSQL_DMLParser.condition_wrapper_return condition_wrapper688 =null;

        PLSQLParser_PLSQLKeys.then_key_return then_key689 =null;

        PLSQLParser_PLSQL_DMLParser.seq_of_statements_return seq_of_statements690 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper691 =null;



        try {
            // PLSQL_DMLParser.g:1003:5: ( when_key ^ condition_wrapper then_key ! ({...}? seq_of_statements | expression_wrapper ) )
            // PLSQL_DMLParser.g:1003:10: when_key ^ condition_wrapper then_key ! ({...}? seq_of_statements | expression_wrapper )
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_when_key_in_searched_case_when_part9679);
            when_key687=gPLSQLParser.when_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(when_key687.getTree(), root_0);

            pushFollow(FOLLOW_condition_wrapper_in_searched_case_when_part9682);
            condition_wrapper688=condition_wrapper();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, condition_wrapper688.getTree());

            pushFollow(FOLLOW_then_key_in_searched_case_when_part9684);
            then_key689=gPLSQLParser.then_key();

            state._fsp--;
            if (state.failed) return retval;

            // PLSQL_DMLParser.g:1003:48: ({...}? seq_of_statements | expression_wrapper )
            int alt224=2;
            switch ( input.LA(1) ) {
            case PLSQL_RESERVED_LOCK:
            case SQL92_RESERVED_DELETE:
            case SQL92_RESERVED_INSERT:
            case SQL92_RESERVED_SELECT:
            case SQL92_RESERVED_UPDATE:
            case SQL92_RESERVED_WITH:
                {
                alt224=1;
                }
                break;
            case LEFT_PAREN:
                {
                int LA224_3 = input.LA(2);

                if ( ((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                    alt224=1;
                }
                else if ( (true) ) {
                    alt224=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 224, 3, input);

                    throw nvae;

                }
                }
                break;
            case REGULAR_ID:
                {
                int LA224_8 = input.LA(2);

                if ( ((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                    alt224=1;
                }
                else if ( (true) ) {
                    alt224=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 224, 8, input);

                    throw nvae;

                }
                }
                break;
            case DELIMITED_ID:
                {
                int LA224_9 = input.LA(2);

                if ( ((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                    alt224=1;
                }
                else if ( (true) ) {
                    alt224=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 224, 9, input);

                    throw nvae;

                }
                }
                break;
            case SQL92_RESERVED_CASE:
                {
                int LA224_10 = input.LA(2);

                if ( ((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                    alt224=1;
                }
                else if ( (((input.LA(1) == SQL92_RESERVED_CASE || input.LA(2) == SQL92_RESERVED_CASE))) ) {
                    alt224=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 224, 10, input);

                    throw nvae;

                }
                }
                break;
            case APPROXIMATE_NUM_LIT:
            case CHAR_STRING:
            case COLON:
            case EXACT_NUM_LIT:
            case INTRODUCER:
            case MINUS_SIGN:
            case PLUS_SIGN:
            case SQL92_RESERVED_ALL:
            case SQL92_RESERVED_ANY:
            case SQL92_RESERVED_DEFAULT:
            case SQL92_RESERVED_DISTINCT:
            case SQL92_RESERVED_EXISTS:
            case SQL92_RESERVED_FALSE:
            case SQL92_RESERVED_NOT:
            case SQL92_RESERVED_NULL:
            case SQL92_RESERVED_PRIOR:
            case SQL92_RESERVED_TRUE:
            case UNSIGNED_INTEGER:
                {
                alt224=2;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 224, 0, input);

                throw nvae;

            }

            switch (alt224) {
                case 1 :
                    // PLSQL_DMLParser.g:1003:49: {...}? seq_of_statements
                    {
                    if ( !((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        throw new FailedPredicateException(input, "searched_case_when_part", "$case_statement::isStatement");
                    }

                    pushFollow(FOLLOW_seq_of_statements_in_searched_case_when_part9690);
                    seq_of_statements690=seq_of_statements();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, seq_of_statements690.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1003:101: expression_wrapper
                    {
                    pushFollow(FOLLOW_expression_wrapper_in_searched_case_when_part9694);
                    expression_wrapper691=expression_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper691.getTree());

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "searched_case_when_part"


    public static class case_else_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "case_else_part"
    // PLSQL_DMLParser.g:1006:1: case_else_part : else_key ^ ({...}? seq_of_statements | expression_wrapper ) ;
    public final PLSQLParser_PLSQL_DMLParser.case_else_part_return case_else_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.case_else_part_return retval = new PLSQLParser_PLSQL_DMLParser.case_else_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.else_key_return else_key692 =null;

        PLSQLParser_PLSQL_DMLParser.seq_of_statements_return seq_of_statements693 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper694 =null;



        try {
            // PLSQL_DMLParser.g:1007:5: ( else_key ^ ({...}? seq_of_statements | expression_wrapper ) )
            // PLSQL_DMLParser.g:1007:10: else_key ^ ({...}? seq_of_statements | expression_wrapper )
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_else_key_in_case_else_part9715);
            else_key692=gPLSQLParser.else_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(else_key692.getTree(), root_0);

            // PLSQL_DMLParser.g:1007:20: ({...}? seq_of_statements | expression_wrapper )
            int alt225=2;
            switch ( input.LA(1) ) {
            case PLSQL_RESERVED_LOCK:
            case SQL92_RESERVED_DELETE:
            case SQL92_RESERVED_INSERT:
            case SQL92_RESERVED_SELECT:
            case SQL92_RESERVED_UPDATE:
            case SQL92_RESERVED_WITH:
                {
                alt225=1;
                }
                break;
            case LEFT_PAREN:
                {
                int LA225_3 = input.LA(2);

                if ( ((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                    alt225=1;
                }
                else if ( (true) ) {
                    alt225=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 225, 3, input);

                    throw nvae;

                }
                }
                break;
            case REGULAR_ID:
                {
                int LA225_8 = input.LA(2);

                if ( ((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                    alt225=1;
                }
                else if ( (true) ) {
                    alt225=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 225, 8, input);

                    throw nvae;

                }
                }
                break;
            case DELIMITED_ID:
                {
                int LA225_9 = input.LA(2);

                if ( ((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                    alt225=1;
                }
                else if ( (true) ) {
                    alt225=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 225, 9, input);

                    throw nvae;

                }
                }
                break;
            case SQL92_RESERVED_CASE:
                {
                int LA225_10 = input.LA(2);

                if ( ((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                    alt225=1;
                }
                else if ( (((input.LA(1) == SQL92_RESERVED_CASE || input.LA(2) == SQL92_RESERVED_CASE))) ) {
                    alt225=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 225, 10, input);

                    throw nvae;

                }
                }
                break;
            case APPROXIMATE_NUM_LIT:
            case CHAR_STRING:
            case COLON:
            case EXACT_NUM_LIT:
            case INTRODUCER:
            case MINUS_SIGN:
            case PLUS_SIGN:
            case SQL92_RESERVED_ALL:
            case SQL92_RESERVED_ANY:
            case SQL92_RESERVED_DEFAULT:
            case SQL92_RESERVED_DISTINCT:
            case SQL92_RESERVED_EXISTS:
            case SQL92_RESERVED_FALSE:
            case SQL92_RESERVED_NOT:
            case SQL92_RESERVED_NULL:
            case SQL92_RESERVED_PRIOR:
            case SQL92_RESERVED_TRUE:
            case UNSIGNED_INTEGER:
                {
                alt225=2;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 225, 0, input);

                throw nvae;

            }

            switch (alt225) {
                case 1 :
                    // PLSQL_DMLParser.g:1007:21: {...}? seq_of_statements
                    {
                    if ( !((((case_statement_scope)case_statement_stack.peek()).isStatement)) ) {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        throw new FailedPredicateException(input, "case_else_part", "$case_statement::isStatement");
                    }

                    pushFollow(FOLLOW_seq_of_statements_in_case_else_part9721);
                    seq_of_statements693=seq_of_statements();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, seq_of_statements693.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1007:73: expression_wrapper
                    {
                    pushFollow(FOLLOW_expression_wrapper_in_case_else_part9725);
                    expression_wrapper694=expression_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper694.getTree());

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "case_else_part"


    public static class atom_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "atom"
    // PLSQL_DMLParser.g:1011:1: atom : ( constant | general_element | LEFT_PAREN ! ( ( select_key )=> subquery | expression_or_vector ) RIGHT_PAREN !);
    public final PLSQLParser_PLSQL_DMLParser.atom_return atom() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.atom_return retval = new PLSQLParser_PLSQL_DMLParser.atom_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN697=null;
        Token RIGHT_PAREN700=null;
        PLSQLParser_PLSQLCommons.constant_return constant695 =null;

        PLSQLParser_PLSQLCommons.general_element_return general_element696 =null;

        PLSQLParser_PLSQL_DMLParser.subquery_return subquery698 =null;

        PLSQLParser_PLSQL_DMLParser.expression_or_vector_return expression_or_vector699 =null;


        Object LEFT_PAREN697_tree=null;
        Object RIGHT_PAREN700_tree=null;

        try {
            // PLSQL_DMLParser.g:1012:5: ( constant | general_element | LEFT_PAREN ! ( ( select_key )=> subquery | expression_or_vector ) RIGHT_PAREN !)
            int alt227=3;
            switch ( input.LA(1) ) {
            case APPROXIMATE_NUM_LIT:
            case CHAR_STRING:
            case EXACT_NUM_LIT:
            case SQL92_RESERVED_DEFAULT:
            case SQL92_RESERVED_FALSE:
            case SQL92_RESERVED_NULL:
            case SQL92_RESERVED_TRUE:
            case UNSIGNED_INTEGER:
                {
                alt227=1;
                }
                break;
            case REGULAR_ID:
                {
                int LA227_2 = input.LA(2);

                if ( (((input.LT(1).getText().equalsIgnoreCase("maxvalue"))||(input.LT(1).getText().equalsIgnoreCase("minvalue"))||(input.LT(1).getText().equalsIgnoreCase("sessiontimezone"))||(input.LT(1).getText().equalsIgnoreCase("dbtimezone")))) ) {
                    alt227=1;
                }
                else if ( (true) ) {
                    alt227=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 227, 2, input);

                    throw nvae;

                }
                }
                break;
            case COLON:
            case DELIMITED_ID:
            case INTRODUCER:
                {
                alt227=2;
                }
                break;
            case LEFT_PAREN:
                {
                alt227=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 227, 0, input);

                throw nvae;

            }

            switch (alt227) {
                case 1 :
                    // PLSQL_DMLParser.g:1012:10: constant
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_constant_in_atom9747);
                    constant695=gPLSQLParser.constant();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, constant695.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1013:10: general_element
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_general_element_in_atom9758);
                    general_element696=gPLSQLParser.general_element();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, general_element696.getTree());

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:1014:10: LEFT_PAREN ! ( ( select_key )=> subquery | expression_or_vector ) RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    LEFT_PAREN697=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_atom9769); if (state.failed) return retval;

                    // PLSQL_DMLParser.g:1014:22: ( ( select_key )=> subquery | expression_or_vector )
                    int alt226=2;
                    int LA226_0 = input.LA(1);

                    if ( (LA226_0==SQL92_RESERVED_SELECT) && (synpred22_PLSQL_DMLParser())) {
                        alt226=1;
                    }
                    else if ( (LA226_0==LEFT_PAREN) ) {
                        int LA226_2 = input.LA(2);

                        if ( (synpred22_PLSQL_DMLParser()) ) {
                            alt226=1;
                        }
                        else if ( (true) ) {
                            alt226=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 226, 2, input);

                            throw nvae;

                        }
                    }
                    else if ( (LA226_0==APPROXIMATE_NUM_LIT||(LA226_0 >= CHAR_STRING && LA226_0 <= COLON)||LA226_0==DELIMITED_ID||LA226_0==EXACT_NUM_LIT||LA226_0==INTRODUCER||LA226_0==MINUS_SIGN||LA226_0==PLUS_SIGN||LA226_0==REGULAR_ID||LA226_0==SQL92_RESERVED_ALL||LA226_0==SQL92_RESERVED_ANY||LA226_0==SQL92_RESERVED_CASE||LA226_0==SQL92_RESERVED_DEFAULT||LA226_0==SQL92_RESERVED_DISTINCT||(LA226_0 >= SQL92_RESERVED_EXISTS && LA226_0 <= SQL92_RESERVED_FALSE)||(LA226_0 >= SQL92_RESERVED_NOT && LA226_0 <= SQL92_RESERVED_NULL)||LA226_0==SQL92_RESERVED_PRIOR||LA226_0==SQL92_RESERVED_TRUE||LA226_0==UNSIGNED_INTEGER) ) {
                        alt226=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 226, 0, input);

                        throw nvae;

                    }
                    switch (alt226) {
                        case 1 :
                            // PLSQL_DMLParser.g:1014:23: ( select_key )=> subquery
                            {
                            pushFollow(FOLLOW_subquery_in_atom9778);
                            subquery698=subquery();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, subquery698.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1014:47: expression_or_vector
                            {
                            pushFollow(FOLLOW_expression_or_vector_in_atom9780);
                            expression_or_vector699=expression_or_vector();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_or_vector699.getTree());

                            }
                            break;

                    }


                    RIGHT_PAREN700=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_atom9783); if (state.failed) return retval;

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "atom"


    public static class expression_or_vector_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "expression_or_vector"
    // PLSQL_DMLParser.g:1017:1: expression_or_vector : expression ( vector_expr )? -> {mode == 1}? ^( VECTOR_EXPR ^( EXPR expression ) vector_expr ) -> expression ;
    public final PLSQLParser_PLSQL_DMLParser.expression_or_vector_return expression_or_vector() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.expression_or_vector_return retval = new PLSQLParser_PLSQL_DMLParser.expression_or_vector_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression701 =null;

        PLSQLParser_PLSQL_DMLParser.vector_expr_return vector_expr702 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_vector_expr=new RewriteRuleSubtreeStream(adaptor,"rule vector_expr");
            int mode = 0;    
        try {
            // PLSQL_DMLParser.g:1019:5: ( expression ( vector_expr )? -> {mode == 1}? ^( VECTOR_EXPR ^( EXPR expression ) vector_expr ) -> expression )
            // PLSQL_DMLParser.g:1019:10: expression ( vector_expr )?
            {
            pushFollow(FOLLOW_expression_in_expression_or_vector9812);
            expression701=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression701.getTree());

            // PLSQL_DMLParser.g:1019:21: ( vector_expr )?
            int alt228=2;
            int LA228_0 = input.LA(1);

            if ( (LA228_0==COMMA) ) {
                alt228=1;
            }
            switch (alt228) {
                case 1 :
                    // PLSQL_DMLParser.g:1019:22: vector_expr
                    {
                    pushFollow(FOLLOW_vector_expr_in_expression_or_vector9815);
                    vector_expr702=vector_expr();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_vector_expr.add(vector_expr702.getTree());

                    if ( state.backtracking==0 ) {mode = 1;}

                    }
                    break;

            }


            // AST REWRITE
            // elements: vector_expr, expression, expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 1020:9: -> {mode == 1}? ^( VECTOR_EXPR ^( EXPR expression ) vector_expr )
            if (mode == 1) {
                // PLSQL_DMLParser.g:1020:25: ^( VECTOR_EXPR ^( EXPR expression ) vector_expr )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(VECTOR_EXPR, "VECTOR_EXPR")
                , root_1);

                // PLSQL_DMLParser.g:1020:39: ^( EXPR expression )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_expression.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_1, stream_vector_expr.nextTree());

                adaptor.addChild(root_0, root_1);
                }

            }

            else // 1021:9: -> expression
            {
                adaptor.addChild(root_0, stream_expression.nextTree());

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "expression_or_vector"


    public static class vector_expr_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "vector_expr"
    // PLSQL_DMLParser.g:1024:1: vector_expr : COMMA expression ( COMMA expression )* -> ( ^( EXPR expression ) )+ ;
    public final PLSQLParser_PLSQL_DMLParser.vector_expr_return vector_expr() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.vector_expr_return retval = new PLSQLParser_PLSQL_DMLParser.vector_expr_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COMMA703=null;
        Token COMMA705=null;
        PLSQLParser_PLSQL_DMLParser.expression_return expression704 =null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression706 =null;


        Object COMMA703_tree=null;
        Object COMMA705_tree=null;
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        try {
            // PLSQL_DMLParser.g:1025:5: ( COMMA expression ( COMMA expression )* -> ( ^( EXPR expression ) )+ )
            // PLSQL_DMLParser.g:1025:10: COMMA expression ( COMMA expression )*
            {
            COMMA703=(Token)match(input,COMMA,FOLLOW_COMMA_in_vector_expr9875); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_COMMA.add(COMMA703);


            pushFollow(FOLLOW_expression_in_vector_expr9877);
            expression704=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression704.getTree());

            // PLSQL_DMLParser.g:1025:27: ( COMMA expression )*
            loop229:
            do {
                int alt229=2;
                int LA229_0 = input.LA(1);

                if ( (LA229_0==COMMA) ) {
                    alt229=1;
                }


                switch (alt229) {
            	case 1 :
            	    // PLSQL_DMLParser.g:1025:28: COMMA expression
            	    {
            	    COMMA705=(Token)match(input,COMMA,FOLLOW_COMMA_in_vector_expr9880); if (state.failed) return retval; 
            	    if ( state.backtracking==0 ) stream_COMMA.add(COMMA705);


            	    pushFollow(FOLLOW_expression_in_vector_expr9882);
            	    expression706=expression();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) stream_expression.add(expression706.getTree());

            	    }
            	    break;

            	default :
            	    break loop229;
                }
            } while (true);


            // AST REWRITE
            // elements: expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 1026:9: -> ( ^( EXPR expression ) )+
            {
                if ( !(stream_expression.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_expression.hasNext() ) {
                    // PLSQL_DMLParser.g:1026:12: ^( EXPR expression )
                    {
                    Object root_1 = (Object)adaptor.nil();
                    root_1 = (Object)adaptor.becomeRoot(
                    (Object)adaptor.create(EXPR, "EXPR")
                    , root_1);

                    adaptor.addChild(root_1, stream_expression.nextTree());

                    adaptor.addChild(root_0, root_1);
                    }

                }
                stream_expression.reset();

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "vector_expr"


    public static class quantified_expression_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "quantified_expression"
    // PLSQL_DMLParser.g:1029:1: quantified_expression : ( some_key ^| exists_key ^| all_key ^| any_key ^) LEFT_PAREN ! expression_wrapper RIGHT_PAREN !;
    public final PLSQLParser_PLSQL_DMLParser.quantified_expression_return quantified_expression() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.quantified_expression_return retval = new PLSQLParser_PLSQL_DMLParser.quantified_expression_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN711=null;
        Token RIGHT_PAREN713=null;
        PLSQLParser_PLSQLKeys.some_key_return some_key707 =null;

        PLSQLParser_PLSQLKeys.exists_key_return exists_key708 =null;

        PLSQLParser_PLSQLKeys.all_key_return all_key709 =null;

        PLSQLParser_PLSQLKeys.any_key_return any_key710 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper712 =null;


        Object LEFT_PAREN711_tree=null;
        Object RIGHT_PAREN713_tree=null;

        try {
            // PLSQL_DMLParser.g:1030:5: ( ( some_key ^| exists_key ^| all_key ^| any_key ^) LEFT_PAREN ! expression_wrapper RIGHT_PAREN !)
            // PLSQL_DMLParser.g:1030:10: ( some_key ^| exists_key ^| all_key ^| any_key ^) LEFT_PAREN ! expression_wrapper RIGHT_PAREN !
            {
            root_0 = (Object)adaptor.nil();


            // PLSQL_DMLParser.g:1030:10: ( some_key ^| exists_key ^| all_key ^| any_key ^)
            int alt230=4;
            switch ( input.LA(1) ) {
            case REGULAR_ID:
                {
                alt230=1;
                }
                break;
            case SQL92_RESERVED_EXISTS:
                {
                alt230=2;
                }
                break;
            case SQL92_RESERVED_ALL:
                {
                alt230=3;
                }
                break;
            case SQL92_RESERVED_ANY:
                {
                alt230=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 230, 0, input);

                throw nvae;

            }

            switch (alt230) {
                case 1 :
                    // PLSQL_DMLParser.g:1030:12: some_key ^
                    {
                    pushFollow(FOLLOW_some_key_in_quantified_expression9923);
                    some_key707=gPLSQLParser.some_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(some_key707.getTree(), root_0);

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1030:24: exists_key ^
                    {
                    pushFollow(FOLLOW_exists_key_in_quantified_expression9928);
                    exists_key708=gPLSQLParser.exists_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(exists_key708.getTree(), root_0);

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:1030:38: all_key ^
                    {
                    pushFollow(FOLLOW_all_key_in_quantified_expression9933);
                    all_key709=gPLSQLParser.all_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(all_key709.getTree(), root_0);

                    }
                    break;
                case 4 :
                    // PLSQL_DMLParser.g:1030:49: any_key ^
                    {
                    pushFollow(FOLLOW_any_key_in_quantified_expression9938);
                    any_key710=gPLSQLParser.any_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(any_key710.getTree(), root_0);

                    }
                    break;

            }


            LEFT_PAREN711=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_quantified_expression9952); if (state.failed) return retval;

            pushFollow(FOLLOW_expression_wrapper_in_quantified_expression9955);
            expression_wrapper712=expression_wrapper();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper712.getTree());

            RIGHT_PAREN713=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_quantified_expression9957); if (state.failed) return retval;

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "quantified_expression"


    public static class standard_function_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "standard_function"
    // PLSQL_DMLParser.g:1034:1: standard_function : ( stantard_function_enabling_over ^ function_argument ( over_clause )? | stantard_function_enabling_using ^ function_argument ( using_clause )? | count_key ^ LEFT_PAREN ! ( ASTERISK | concatenation_wrapper ) RIGHT_PAREN ! ( over_clause )? | ( cast_key ^| xmlcast_key ^) LEFT_PAREN ! ( multiset_key ! LEFT_PAREN ! subquery RIGHT_PAREN | concatenation_wrapper ) as_key ! type_spec RIGHT_PAREN !| chr_key ^ LEFT_PAREN ! concatenation_wrapper using_key ! nchar_cs_key RIGHT_PAREN !| collect_key ^ LEFT_PAREN ! ( distinct_key | unique_key )? column_name ( collect_order_by_part )? RIGHT_PAREN !| stantard_function_enabling_within_or_over ^ function_argument ( within_or_over_part )+ | decompose_key ^ LEFT_PAREN ! concatenation_wrapper ( canonical_key | compatibility_key )? RIGHT_PAREN !| extract_key ^ LEFT_PAREN ! REGULAR_ID from_key ! concatenation_wrapper RIGHT_PAREN !| ( first_value_key ^| last_value_key ^) LEFT_PAREN ! concatenation_wrapper ( ignore_key ! nulls_key )? RIGHT_PAREN ! over_clause | stantard_function_pedictions ^ LEFT_PAREN ! expression_wrapper ( COMMA expression_wrapper )* ( cost_matrix_clause )? ( using_clause )? RIGHT_PAREN !| translate_key ^ LEFT_PAREN ! expression_wrapper ( using_key ! ( char_cs_key | nchar_cs_key ) )? ( COMMA expression_wrapper )* RIGHT_PAREN !| treat_key ^ LEFT_PAREN ! expression_wrapper as_key ! ( ref_key )? type_spec RIGHT_PAREN !| trim_key ^ LEFT_PAREN ! ( ( leading_key | trailing_key | both_key )? concatenation_wrapper from_key !)? concatenation_wrapper RIGHT_PAREN !| xmlagg_key ^ LEFT_PAREN ! expression_wrapper ( order_by_clause )? RIGHT_PAREN !| ( xmlcolattval_key ^| xmlforest_key ^) LEFT_PAREN ! xml_multiuse_expression_element ( COMMA ! xml_multiuse_expression_element )* RIGHT_PAREN !| xmlelement_key ^ LEFT_PAREN ! ( entityescaping_key | noentityescaping_key )? ( name_key | evalname_key )? expression_wrapper ({...}? COMMA ! xml_attributes_clause )? ( COMMA ! expression_wrapper ( alias )? )* RIGHT_PAREN !| xmlexists_key ^ LEFT_PAREN ! expression_wrapper ( xml_passing_clause )? RIGHT_PAREN !| xmlparse_key ^ LEFT_PAREN ! ( document_key | content_key ) concatenation_wrapper ( wellformed_key )? RIGHT_PAREN !| xmlpi_key ^ LEFT_PAREN ! ( name_key id | evalname_key concatenation_wrapper ) ( COMMA ! concatenation_wrapper )? RIGHT_PAREN !| xmlquery_key ^ LEFT_PAREN ! concatenation_wrapper ( xml_passing_clause )? returning_key ! content_key ! ( null_key on_key ! empty_key !)? RIGHT_PAREN !| xmlroot_key ^ LEFT_PAREN ! concatenation_wrapper xmlroot_param_version_part ( COMMA ! xmlroot_param_standalone_part )? RIGHT_PAREN !| xmlserialize_key ^ LEFT_PAREN ! ( document_key | content_key ) concatenation_wrapper ( as_key ! type_spec )? ( xmlserialize_param_enconding_part )? ( xmlserialize_param_version_part )? ( xmlserialize_param_ident_part )? ( ( hide_key | show_key ) defaults_key )? RIGHT_PAREN !| xmltable_key ^ LEFT_PAREN ! ( xml_namespaces_clause )? concatenation_wrapper ( xml_passing_clause )? ( columns_key ! xml_table_column ( COMMA ! xml_table_column ) )? RIGHT_PAREN !);
    public final PLSQLParser_PLSQL_DMLParser.standard_function_return standard_function() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.standard_function_return retval = new PLSQLParser_PLSQL_DMLParser.standard_function_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN721=null;
        Token ASTERISK722=null;
        Token RIGHT_PAREN724=null;
        Token LEFT_PAREN728=null;
        Token LEFT_PAREN730=null;
        Token RIGHT_PAREN732=null;
        Token RIGHT_PAREN736=null;
        Token LEFT_PAREN738=null;
        Token RIGHT_PAREN742=null;
        Token LEFT_PAREN744=null;
        Token RIGHT_PAREN749=null;
        Token LEFT_PAREN754=null;
        Token RIGHT_PAREN758=null;
        Token LEFT_PAREN760=null;
        Token REGULAR_ID761=null;
        Token RIGHT_PAREN764=null;
        Token LEFT_PAREN767=null;
        Token RIGHT_PAREN771=null;
        Token LEFT_PAREN774=null;
        Token COMMA776=null;
        Token RIGHT_PAREN780=null;
        Token LEFT_PAREN782=null;
        Token COMMA787=null;
        Token RIGHT_PAREN789=null;
        Token LEFT_PAREN791=null;
        Token RIGHT_PAREN796=null;
        Token LEFT_PAREN798=null;
        Token RIGHT_PAREN805=null;
        Token LEFT_PAREN807=null;
        Token RIGHT_PAREN810=null;
        Token LEFT_PAREN813=null;
        Token COMMA815=null;
        Token RIGHT_PAREN817=null;
        Token LEFT_PAREN819=null;
        Token COMMA825=null;
        Token COMMA827=null;
        Token RIGHT_PAREN830=null;
        Token LEFT_PAREN832=null;
        Token RIGHT_PAREN835=null;
        Token LEFT_PAREN837=null;
        Token RIGHT_PAREN842=null;
        Token LEFT_PAREN844=null;
        Token COMMA849=null;
        Token RIGHT_PAREN851=null;
        Token LEFT_PAREN853=null;
        Token RIGHT_PAREN861=null;
        Token LEFT_PAREN863=null;
        Token COMMA866=null;
        Token RIGHT_PAREN868=null;
        Token LEFT_PAREN870=null;
        Token RIGHT_PAREN882=null;
        Token LEFT_PAREN884=null;
        Token COMMA890=null;
        Token RIGHT_PAREN892=null;
        PLSQLParser_PLSQL_DMLParser.stantard_function_enabling_over_return stantard_function_enabling_over714 =null;

        PLSQLParser_PLSQLCommons.function_argument_return function_argument715 =null;

        PLSQLParser_PLSQL_DMLParser.over_clause_return over_clause716 =null;

        PLSQLParser_PLSQL_DMLParser.stantard_function_enabling_using_return stantard_function_enabling_using717 =null;

        PLSQLParser_PLSQLCommons.function_argument_return function_argument718 =null;

        PLSQLParser_PLSQL_DMLParser.using_clause_return using_clause719 =null;

        PLSQLParser_PLSQLKeys.count_key_return count_key720 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper723 =null;

        PLSQLParser_PLSQL_DMLParser.over_clause_return over_clause725 =null;

        PLSQLParser_PLSQLKeys.cast_key_return cast_key726 =null;

        PLSQLParser_PLSQLKeys.xmlcast_key_return xmlcast_key727 =null;

        PLSQLParser_PLSQLKeys.multiset_key_return multiset_key729 =null;

        PLSQLParser_PLSQL_DMLParser.subquery_return subquery731 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper733 =null;

        PLSQLParser_PLSQLKeys.as_key_return as_key734 =null;

        PLSQLParser_PLSQLCommons.type_spec_return type_spec735 =null;

        PLSQLParser_PLSQLKeys.chr_key_return chr_key737 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper739 =null;

        PLSQLParser_PLSQLKeys.using_key_return using_key740 =null;

        PLSQLParser_PLSQLKeys.nchar_cs_key_return nchar_cs_key741 =null;

        PLSQLParser_PLSQLKeys.collect_key_return collect_key743 =null;

        PLSQLParser_PLSQLKeys.distinct_key_return distinct_key745 =null;

        PLSQLParser_PLSQLKeys.unique_key_return unique_key746 =null;

        PLSQLParser_PLSQLCommons.column_name_return column_name747 =null;

        PLSQLParser_PLSQL_DMLParser.collect_order_by_part_return collect_order_by_part748 =null;

        PLSQLParser_PLSQL_DMLParser.stantard_function_enabling_within_or_over_return stantard_function_enabling_within_or_over750 =null;

        PLSQLParser_PLSQLCommons.function_argument_return function_argument751 =null;

        PLSQLParser_PLSQL_DMLParser.within_or_over_part_return within_or_over_part752 =null;

        PLSQLParser_PLSQLKeys.decompose_key_return decompose_key753 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper755 =null;

        PLSQLParser_PLSQLKeys.canonical_key_return canonical_key756 =null;

        PLSQLParser_PLSQLKeys.compatibility_key_return compatibility_key757 =null;

        PLSQLParser_PLSQLKeys.extract_key_return extract_key759 =null;

        PLSQLParser_PLSQLKeys.from_key_return from_key762 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper763 =null;

        PLSQLParser_PLSQLKeys.first_value_key_return first_value_key765 =null;

        PLSQLParser_PLSQLKeys.last_value_key_return last_value_key766 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper768 =null;

        PLSQLParser_PLSQLKeys.ignore_key_return ignore_key769 =null;

        PLSQLParser_PLSQLKeys.nulls_key_return nulls_key770 =null;

        PLSQLParser_PLSQL_DMLParser.over_clause_return over_clause772 =null;

        PLSQLParser_PLSQL_DMLParser.stantard_function_pedictions_return stantard_function_pedictions773 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper775 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper777 =null;

        PLSQLParser_PLSQL_DMLParser.cost_matrix_clause_return cost_matrix_clause778 =null;

        PLSQLParser_PLSQL_DMLParser.using_clause_return using_clause779 =null;

        PLSQLParser_PLSQLKeys.translate_key_return translate_key781 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper783 =null;

        PLSQLParser_PLSQLKeys.using_key_return using_key784 =null;

        PLSQLParser_PLSQLKeys.char_cs_key_return char_cs_key785 =null;

        PLSQLParser_PLSQLKeys.nchar_cs_key_return nchar_cs_key786 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper788 =null;

        PLSQLParser_PLSQLKeys.treat_key_return treat_key790 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper792 =null;

        PLSQLParser_PLSQLKeys.as_key_return as_key793 =null;

        PLSQLParser_PLSQLKeys.ref_key_return ref_key794 =null;

        PLSQLParser_PLSQLCommons.type_spec_return type_spec795 =null;

        PLSQLParser_PLSQLKeys.trim_key_return trim_key797 =null;

        PLSQLParser_PLSQLKeys.leading_key_return leading_key799 =null;

        PLSQLParser_PLSQLKeys.trailing_key_return trailing_key800 =null;

        PLSQLParser_PLSQLKeys.both_key_return both_key801 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper802 =null;

        PLSQLParser_PLSQLKeys.from_key_return from_key803 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper804 =null;

        PLSQLParser_PLSQLKeys.xmlagg_key_return xmlagg_key806 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper808 =null;

        PLSQLParser_PLSQL_DMLParser.order_by_clause_return order_by_clause809 =null;

        PLSQLParser_PLSQLKeys.xmlcolattval_key_return xmlcolattval_key811 =null;

        PLSQLParser_PLSQLKeys.xmlforest_key_return xmlforest_key812 =null;

        PLSQLParser_PLSQL_DMLParser.xml_multiuse_expression_element_return xml_multiuse_expression_element814 =null;

        PLSQLParser_PLSQL_DMLParser.xml_multiuse_expression_element_return xml_multiuse_expression_element816 =null;

        PLSQLParser_PLSQLKeys.xmlelement_key_return xmlelement_key818 =null;

        PLSQLParser_PLSQLKeys.entityescaping_key_return entityescaping_key820 =null;

        PLSQLParser_PLSQLKeys.noentityescaping_key_return noentityescaping_key821 =null;

        PLSQLParser_PLSQLKeys.name_key_return name_key822 =null;

        PLSQLParser_PLSQLKeys.evalname_key_return evalname_key823 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper824 =null;

        PLSQLParser_PLSQL_DMLParser.xml_attributes_clause_return xml_attributes_clause826 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper828 =null;

        PLSQLParser_PLSQLCommons.alias_return alias829 =null;

        PLSQLParser_PLSQLKeys.xmlexists_key_return xmlexists_key831 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper833 =null;

        PLSQLParser_PLSQL_DMLParser.xml_passing_clause_return xml_passing_clause834 =null;

        PLSQLParser_PLSQLKeys.xmlparse_key_return xmlparse_key836 =null;

        PLSQLParser_PLSQLKeys.document_key_return document_key838 =null;

        PLSQLParser_PLSQLKeys.content_key_return content_key839 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper840 =null;

        PLSQLParser_PLSQLKeys.wellformed_key_return wellformed_key841 =null;

        PLSQLParser_PLSQLKeys.xmlpi_key_return xmlpi_key843 =null;

        PLSQLParser_PLSQLKeys.name_key_return name_key845 =null;

        PLSQLParser_PLSQLCommons.id_return id846 =null;

        PLSQLParser_PLSQLKeys.evalname_key_return evalname_key847 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper848 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper850 =null;

        PLSQLParser_PLSQLKeys.xmlquery_key_return xmlquery_key852 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper854 =null;

        PLSQLParser_PLSQL_DMLParser.xml_passing_clause_return xml_passing_clause855 =null;

        PLSQLParser_PLSQLKeys.returning_key_return returning_key856 =null;

        PLSQLParser_PLSQLKeys.content_key_return content_key857 =null;

        PLSQLParser_PLSQLKeys.null_key_return null_key858 =null;

        PLSQLParser_PLSQLKeys.on_key_return on_key859 =null;

        PLSQLParser_PLSQLKeys.empty_key_return empty_key860 =null;

        PLSQLParser_PLSQLKeys.xmlroot_key_return xmlroot_key862 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper864 =null;

        PLSQLParser_PLSQL_DMLParser.xmlroot_param_version_part_return xmlroot_param_version_part865 =null;

        PLSQLParser_PLSQL_DMLParser.xmlroot_param_standalone_part_return xmlroot_param_standalone_part867 =null;

        PLSQLParser_PLSQLKeys.xmlserialize_key_return xmlserialize_key869 =null;

        PLSQLParser_PLSQLKeys.document_key_return document_key871 =null;

        PLSQLParser_PLSQLKeys.content_key_return content_key872 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper873 =null;

        PLSQLParser_PLSQLKeys.as_key_return as_key874 =null;

        PLSQLParser_PLSQLCommons.type_spec_return type_spec875 =null;

        PLSQLParser_PLSQL_DMLParser.xmlserialize_param_enconding_part_return xmlserialize_param_enconding_part876 =null;

        PLSQLParser_PLSQL_DMLParser.xmlserialize_param_version_part_return xmlserialize_param_version_part877 =null;

        PLSQLParser_PLSQL_DMLParser.xmlserialize_param_ident_part_return xmlserialize_param_ident_part878 =null;

        PLSQLParser_PLSQLKeys.hide_key_return hide_key879 =null;

        PLSQLParser_PLSQLKeys.show_key_return show_key880 =null;

        PLSQLParser_PLSQLKeys.defaults_key_return defaults_key881 =null;

        PLSQLParser_PLSQLKeys.xmltable_key_return xmltable_key883 =null;

        PLSQLParser_PLSQL_DMLParser.xml_namespaces_clause_return xml_namespaces_clause885 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper886 =null;

        PLSQLParser_PLSQL_DMLParser.xml_passing_clause_return xml_passing_clause887 =null;

        PLSQLParser_PLSQLKeys.columns_key_return columns_key888 =null;

        PLSQLParser_PLSQL_DMLParser.xml_table_column_return xml_table_column889 =null;

        PLSQLParser_PLSQL_DMLParser.xml_table_column_return xml_table_column891 =null;


        Object LEFT_PAREN721_tree=null;
        Object ASTERISK722_tree=null;
        Object RIGHT_PAREN724_tree=null;
        Object LEFT_PAREN728_tree=null;
        Object LEFT_PAREN730_tree=null;
        Object RIGHT_PAREN732_tree=null;
        Object RIGHT_PAREN736_tree=null;
        Object LEFT_PAREN738_tree=null;
        Object RIGHT_PAREN742_tree=null;
        Object LEFT_PAREN744_tree=null;
        Object RIGHT_PAREN749_tree=null;
        Object LEFT_PAREN754_tree=null;
        Object RIGHT_PAREN758_tree=null;
        Object LEFT_PAREN760_tree=null;
        Object REGULAR_ID761_tree=null;
        Object RIGHT_PAREN764_tree=null;
        Object LEFT_PAREN767_tree=null;
        Object RIGHT_PAREN771_tree=null;
        Object LEFT_PAREN774_tree=null;
        Object COMMA776_tree=null;
        Object RIGHT_PAREN780_tree=null;
        Object LEFT_PAREN782_tree=null;
        Object COMMA787_tree=null;
        Object RIGHT_PAREN789_tree=null;
        Object LEFT_PAREN791_tree=null;
        Object RIGHT_PAREN796_tree=null;
        Object LEFT_PAREN798_tree=null;
        Object RIGHT_PAREN805_tree=null;
        Object LEFT_PAREN807_tree=null;
        Object RIGHT_PAREN810_tree=null;
        Object LEFT_PAREN813_tree=null;
        Object COMMA815_tree=null;
        Object RIGHT_PAREN817_tree=null;
        Object LEFT_PAREN819_tree=null;
        Object COMMA825_tree=null;
        Object COMMA827_tree=null;
        Object RIGHT_PAREN830_tree=null;
        Object LEFT_PAREN832_tree=null;
        Object RIGHT_PAREN835_tree=null;
        Object LEFT_PAREN837_tree=null;
        Object RIGHT_PAREN842_tree=null;
        Object LEFT_PAREN844_tree=null;
        Object COMMA849_tree=null;
        Object RIGHT_PAREN851_tree=null;
        Object LEFT_PAREN853_tree=null;
        Object RIGHT_PAREN861_tree=null;
        Object LEFT_PAREN863_tree=null;
        Object COMMA866_tree=null;
        Object RIGHT_PAREN868_tree=null;
        Object LEFT_PAREN870_tree=null;
        Object RIGHT_PAREN882_tree=null;
        Object LEFT_PAREN884_tree=null;
        Object COMMA890_tree=null;
        Object RIGHT_PAREN892_tree=null;

        try {
            // PLSQL_DMLParser.g:1035:5: ( stantard_function_enabling_over ^ function_argument ( over_clause )? | stantard_function_enabling_using ^ function_argument ( using_clause )? | count_key ^ LEFT_PAREN ! ( ASTERISK | concatenation_wrapper ) RIGHT_PAREN ! ( over_clause )? | ( cast_key ^| xmlcast_key ^) LEFT_PAREN ! ( multiset_key ! LEFT_PAREN ! subquery RIGHT_PAREN | concatenation_wrapper ) as_key ! type_spec RIGHT_PAREN !| chr_key ^ LEFT_PAREN ! concatenation_wrapper using_key ! nchar_cs_key RIGHT_PAREN !| collect_key ^ LEFT_PAREN ! ( distinct_key | unique_key )? column_name ( collect_order_by_part )? RIGHT_PAREN !| stantard_function_enabling_within_or_over ^ function_argument ( within_or_over_part )+ | decompose_key ^ LEFT_PAREN ! concatenation_wrapper ( canonical_key | compatibility_key )? RIGHT_PAREN !| extract_key ^ LEFT_PAREN ! REGULAR_ID from_key ! concatenation_wrapper RIGHT_PAREN !| ( first_value_key ^| last_value_key ^) LEFT_PAREN ! concatenation_wrapper ( ignore_key ! nulls_key )? RIGHT_PAREN ! over_clause | stantard_function_pedictions ^ LEFT_PAREN ! expression_wrapper ( COMMA expression_wrapper )* ( cost_matrix_clause )? ( using_clause )? RIGHT_PAREN !| translate_key ^ LEFT_PAREN ! expression_wrapper ( using_key ! ( char_cs_key | nchar_cs_key ) )? ( COMMA expression_wrapper )* RIGHT_PAREN !| treat_key ^ LEFT_PAREN ! expression_wrapper as_key ! ( ref_key )? type_spec RIGHT_PAREN !| trim_key ^ LEFT_PAREN ! ( ( leading_key | trailing_key | both_key )? concatenation_wrapper from_key !)? concatenation_wrapper RIGHT_PAREN !| xmlagg_key ^ LEFT_PAREN ! expression_wrapper ( order_by_clause )? RIGHT_PAREN !| ( xmlcolattval_key ^| xmlforest_key ^) LEFT_PAREN ! xml_multiuse_expression_element ( COMMA ! xml_multiuse_expression_element )* RIGHT_PAREN !| xmlelement_key ^ LEFT_PAREN ! ( entityescaping_key | noentityescaping_key )? ( name_key | evalname_key )? expression_wrapper ({...}? COMMA ! xml_attributes_clause )? ( COMMA ! expression_wrapper ( alias )? )* RIGHT_PAREN !| xmlexists_key ^ LEFT_PAREN ! expression_wrapper ( xml_passing_clause )? RIGHT_PAREN !| xmlparse_key ^ LEFT_PAREN ! ( document_key | content_key ) concatenation_wrapper ( wellformed_key )? RIGHT_PAREN !| xmlpi_key ^ LEFT_PAREN ! ( name_key id | evalname_key concatenation_wrapper ) ( COMMA ! concatenation_wrapper )? RIGHT_PAREN !| xmlquery_key ^ LEFT_PAREN ! concatenation_wrapper ( xml_passing_clause )? returning_key ! content_key ! ( null_key on_key ! empty_key !)? RIGHT_PAREN !| xmlroot_key ^ LEFT_PAREN ! concatenation_wrapper xmlroot_param_version_part ( COMMA ! xmlroot_param_standalone_part )? RIGHT_PAREN !| xmlserialize_key ^ LEFT_PAREN ! ( document_key | content_key ) concatenation_wrapper ( as_key ! type_spec )? ( xmlserialize_param_enconding_part )? ( xmlserialize_param_version_part )? ( xmlserialize_param_ident_part )? ( ( hide_key | show_key ) defaults_key )? RIGHT_PAREN !| xmltable_key ^ LEFT_PAREN ! ( xml_namespaces_clause )? concatenation_wrapper ( xml_passing_clause )? ( columns_key ! xml_table_column ( COMMA ! xml_table_column ) )? RIGHT_PAREN !)
            int alt278=24;
            int LA278_0 = input.LA(1);

            if ( (LA278_0==REGULAR_ID) ) {
                int LA278_1 = input.LA(2);

                if ( ((enablesOverClause(input.LT(1).getText()))) ) {
                    alt278=1;
                }
                else if ( ((enablesUsingClause(input.LT(1).getText()))) ) {
                    alt278=2;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("count"))) ) {
                    alt278=3;
                }
                else if ( (((input.LT(1).getText().equalsIgnoreCase("cast"))||(input.LT(1).getText().equalsIgnoreCase("xmlcast")))) ) {
                    alt278=4;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("chr"))) ) {
                    alt278=5;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("collect"))) ) {
                    alt278=6;
                }
                else if ( ((enablesWithinOrOverClause(input.LT(1).getText()))) ) {
                    alt278=7;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("decompose"))) ) {
                    alt278=8;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("extract"))) ) {
                    alt278=9;
                }
                else if ( (((input.LT(1).getText().equalsIgnoreCase("first_value"))||(input.LT(1).getText().equalsIgnoreCase("last_value")))) ) {
                    alt278=10;
                }
                else if ( ((isStandardPredictionFunction(input.LT(1).getText()))) ) {
                    alt278=11;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("translate"))) ) {
                    alt278=12;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("treat"))) ) {
                    alt278=13;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("trim"))) ) {
                    alt278=14;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("xmlagg"))) ) {
                    alt278=15;
                }
                else if ( (((input.LT(1).getText().equalsIgnoreCase("xmlcolattval"))||(input.LT(1).getText().equalsIgnoreCase("xmlforest")))) ) {
                    alt278=16;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("xmlelement"))) ) {
                    alt278=17;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("xmlexists"))) ) {
                    alt278=18;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("xmlparse"))) ) {
                    alt278=19;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("xmlpi"))) ) {
                    alt278=20;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("xmlquery"))) ) {
                    alt278=21;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("xmlroot"))) ) {
                    alt278=22;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("xmlserialize"))) ) {
                    alt278=23;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("xmltable"))) ) {
                    alt278=24;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 278, 1, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 278, 0, input);

                throw nvae;

            }
            switch (alt278) {
                case 1 :
                    // PLSQL_DMLParser.g:1035:10: stantard_function_enabling_over ^ function_argument ( over_clause )?
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_stantard_function_enabling_over_in_standard_function9978);
                    stantard_function_enabling_over714=stantard_function_enabling_over();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(stantard_function_enabling_over714.getTree(), root_0);

                    pushFollow(FOLLOW_function_argument_in_standard_function9981);
                    function_argument715=gPLSQLParser.function_argument();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, function_argument715.getTree());

                    // PLSQL_DMLParser.g:1035:61: ( over_clause )?
                    int alt231=2;
                    int LA231_0 = input.LA(1);

                    if ( (LA231_0==REGULAR_ID) ) {
                        int LA231_1 = input.LA(2);

                        if ( (LA231_1==LEFT_PAREN) ) {
                            int LA231_3 = input.LA(3);

                            if ( (LA231_3==REGULAR_ID) ) {
                                int LA231_10 = input.LA(4);

                                if ( (LA231_10==SQL92_RESERVED_BY) && ((input.LT(1).getText().equalsIgnoreCase("over")))) {
                                    alt231=1;
                                }
                            }
                            else if ( (LA231_3==RIGHT_PAREN||LA231_3==SQL92_RESERVED_ORDER) && ((input.LT(1).getText().equalsIgnoreCase("over")))) {
                                alt231=1;
                            }
                        }
                    }
                    switch (alt231) {
                        case 1 :
                            // PLSQL_DMLParser.g:1035:61: over_clause
                            {
                            pushFollow(FOLLOW_over_clause_in_standard_function9983);
                            over_clause716=over_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, over_clause716.getTree());

                            }
                            break;

                    }


                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1036:10: stantard_function_enabling_using ^ function_argument ( using_clause )?
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_stantard_function_enabling_using_in_standard_function9995);
                    stantard_function_enabling_using717=stantard_function_enabling_using();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(stantard_function_enabling_using717.getTree(), root_0);

                    pushFollow(FOLLOW_function_argument_in_standard_function9998);
                    function_argument718=gPLSQLParser.function_argument();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, function_argument718.getTree());

                    // PLSQL_DMLParser.g:1036:62: ( using_clause )?
                    int alt232=2;
                    alt232 = dfa232.predict(input);
                    switch (alt232) {
                        case 1 :
                            // PLSQL_DMLParser.g:1036:62: using_clause
                            {
                            pushFollow(FOLLOW_using_clause_in_standard_function10000);
                            using_clause719=using_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, using_clause719.getTree());

                            }
                            break;

                    }


                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:1037:10: count_key ^ LEFT_PAREN ! ( ASTERISK | concatenation_wrapper ) RIGHT_PAREN ! ( over_clause )?
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_count_key_in_standard_function10012);
                    count_key720=gPLSQLParser.count_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(count_key720.getTree(), root_0);

                    LEFT_PAREN721=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10027); if (state.failed) return retval;

                    // PLSQL_DMLParser.g:1039:17: ( ASTERISK | concatenation_wrapper )
                    int alt233=2;
                    int LA233_0 = input.LA(1);

                    if ( (LA233_0==ASTERISK) ) {
                        alt233=1;
                    }
                    else if ( (LA233_0==APPROXIMATE_NUM_LIT||(LA233_0 >= CHAR_STRING && LA233_0 <= COLON)||LA233_0==DELIMITED_ID||LA233_0==EXACT_NUM_LIT||LA233_0==INTRODUCER||LA233_0==LEFT_PAREN||LA233_0==MINUS_SIGN||LA233_0==PLUS_SIGN||LA233_0==REGULAR_ID||LA233_0==SQL92_RESERVED_ALL||LA233_0==SQL92_RESERVED_ANY||LA233_0==SQL92_RESERVED_CASE||LA233_0==SQL92_RESERVED_DEFAULT||LA233_0==SQL92_RESERVED_DISTINCT||(LA233_0 >= SQL92_RESERVED_EXISTS && LA233_0 <= SQL92_RESERVED_FALSE)||LA233_0==SQL92_RESERVED_NULL||LA233_0==SQL92_RESERVED_PRIOR||LA233_0==SQL92_RESERVED_TRUE||LA233_0==UNSIGNED_INTEGER) ) {
                        alt233=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 233, 0, input);

                        throw nvae;

                    }
                    switch (alt233) {
                        case 1 :
                            // PLSQL_DMLParser.g:1039:19: ASTERISK
                            {
                            ASTERISK722=(Token)match(input,ASTERISK,FOLLOW_ASTERISK_in_standard_function10048); if (state.failed) return retval;
                            if ( state.backtracking==0 ) {
                            ASTERISK722_tree = 
                            (Object)adaptor.create(ASTERISK722)
                            ;
                            adaptor.addChild(root_0, ASTERISK722_tree);
                            }

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1039:30: concatenation_wrapper
                            {
                            pushFollow(FOLLOW_concatenation_wrapper_in_standard_function10052);
                            concatenation_wrapper723=concatenation_wrapper();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper723.getTree());

                            }
                            break;

                    }


                    RIGHT_PAREN724=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function10069); if (state.failed) return retval;

                    // PLSQL_DMLParser.g:1040:26: ( over_clause )?
                    int alt234=2;
                    int LA234_0 = input.LA(1);

                    if ( (LA234_0==REGULAR_ID) ) {
                        int LA234_1 = input.LA(2);

                        if ( (LA234_1==LEFT_PAREN) ) {
                            int LA234_3 = input.LA(3);

                            if ( (LA234_3==REGULAR_ID) ) {
                                int LA234_10 = input.LA(4);

                                if ( (LA234_10==SQL92_RESERVED_BY) && ((input.LT(1).getText().equalsIgnoreCase("over")))) {
                                    alt234=1;
                                }
                            }
                            else if ( (LA234_3==RIGHT_PAREN||LA234_3==SQL92_RESERVED_ORDER) && ((input.LT(1).getText().equalsIgnoreCase("over")))) {
                                alt234=1;
                            }
                        }
                    }
                    switch (alt234) {
                        case 1 :
                            // PLSQL_DMLParser.g:1040:26: over_clause
                            {
                            pushFollow(FOLLOW_over_clause_in_standard_function10072);
                            over_clause725=over_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, over_clause725.getTree());

                            }
                            break;

                    }


                    }
                    break;
                case 4 :
                    // PLSQL_DMLParser.g:1041:10: ( cast_key ^| xmlcast_key ^) LEFT_PAREN ! ( multiset_key ! LEFT_PAREN ! subquery RIGHT_PAREN | concatenation_wrapper ) as_key ! type_spec RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    // PLSQL_DMLParser.g:1041:10: ( cast_key ^| xmlcast_key ^)
                    int alt235=2;
                    int LA235_0 = input.LA(1);

                    if ( (LA235_0==REGULAR_ID) ) {
                        int LA235_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("cast"))) ) {
                            alt235=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("xmlcast"))) ) {
                            alt235=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 235, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 235, 0, input);

                        throw nvae;

                    }
                    switch (alt235) {
                        case 1 :
                            // PLSQL_DMLParser.g:1041:11: cast_key ^
                            {
                            pushFollow(FOLLOW_cast_key_in_standard_function10085);
                            cast_key726=gPLSQLParser.cast_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(cast_key726.getTree(), root_0);

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1041:21: xmlcast_key ^
                            {
                            pushFollow(FOLLOW_xmlcast_key_in_standard_function10088);
                            xmlcast_key727=gPLSQLParser.xmlcast_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmlcast_key727.getTree(), root_0);

                            }
                            break;

                    }


                    LEFT_PAREN728=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10105); if (state.failed) return retval;

                    // PLSQL_DMLParser.g:1043:17: ( multiset_key ! LEFT_PAREN ! subquery RIGHT_PAREN | concatenation_wrapper )
                    int alt236=2;
                    int LA236_0 = input.LA(1);

                    if ( (LA236_0==REGULAR_ID) ) {
                        int LA236_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("multiset"))) ) {
                            alt236=1;
                        }
                        else if ( (true) ) {
                            alt236=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 236, 1, input);

                            throw nvae;

                        }
                    }
                    else if ( (LA236_0==APPROXIMATE_NUM_LIT||(LA236_0 >= CHAR_STRING && LA236_0 <= COLON)||LA236_0==DELIMITED_ID||LA236_0==EXACT_NUM_LIT||LA236_0==INTRODUCER||LA236_0==LEFT_PAREN||LA236_0==MINUS_SIGN||LA236_0==PLUS_SIGN||LA236_0==SQL92_RESERVED_ALL||LA236_0==SQL92_RESERVED_ANY||LA236_0==SQL92_RESERVED_CASE||LA236_0==SQL92_RESERVED_DEFAULT||LA236_0==SQL92_RESERVED_DISTINCT||(LA236_0 >= SQL92_RESERVED_EXISTS && LA236_0 <= SQL92_RESERVED_FALSE)||LA236_0==SQL92_RESERVED_NULL||LA236_0==SQL92_RESERVED_PRIOR||LA236_0==SQL92_RESERVED_TRUE||LA236_0==UNSIGNED_INTEGER) ) {
                        alt236=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 236, 0, input);

                        throw nvae;

                    }
                    switch (alt236) {
                        case 1 :
                            // PLSQL_DMLParser.g:1043:18: multiset_key ! LEFT_PAREN ! subquery RIGHT_PAREN
                            {
                            pushFollow(FOLLOW_multiset_key_in_standard_function10125);
                            multiset_key729=gPLSQLParser.multiset_key();

                            state._fsp--;
                            if (state.failed) return retval;

                            LEFT_PAREN730=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10128); if (state.failed) return retval;

                            pushFollow(FOLLOW_subquery_in_standard_function10131);
                            subquery731=subquery();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, subquery731.getTree());

                            RIGHT_PAREN732=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function10133); if (state.failed) return retval;
                            if ( state.backtracking==0 ) {
                            RIGHT_PAREN732_tree = 
                            (Object)adaptor.create(RIGHT_PAREN732)
                            ;
                            adaptor.addChild(root_0, RIGHT_PAREN732_tree);
                            }

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1043:65: concatenation_wrapper
                            {
                            pushFollow(FOLLOW_concatenation_wrapper_in_standard_function10135);
                            concatenation_wrapper733=concatenation_wrapper();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper733.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_as_key_in_standard_function10138);
                    as_key734=gPLSQLParser.as_key();

                    state._fsp--;
                    if (state.failed) return retval;

                    pushFollow(FOLLOW_type_spec_in_standard_function10141);
                    type_spec735=gPLSQLParser.type_spec();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, type_spec735.getTree());

                    RIGHT_PAREN736=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function10156); if (state.failed) return retval;

                    }
                    break;
                case 5 :
                    // PLSQL_DMLParser.g:1045:10: chr_key ^ LEFT_PAREN ! concatenation_wrapper using_key ! nchar_cs_key RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_chr_key_in_standard_function10168);
                    chr_key737=gPLSQLParser.chr_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(chr_key737.getTree(), root_0);

                    LEFT_PAREN738=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10183); if (state.failed) return retval;

                    pushFollow(FOLLOW_concatenation_wrapper_in_standard_function10203);
                    concatenation_wrapper739=concatenation_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper739.getTree());

                    pushFollow(FOLLOW_using_key_in_standard_function10205);
                    using_key740=gPLSQLParser.using_key();

                    state._fsp--;
                    if (state.failed) return retval;

                    pushFollow(FOLLOW_nchar_cs_key_in_standard_function10208);
                    nchar_cs_key741=gPLSQLParser.nchar_cs_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, nchar_cs_key741.getTree());

                    RIGHT_PAREN742=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function10223); if (state.failed) return retval;

                    }
                    break;
                case 6 :
                    // PLSQL_DMLParser.g:1049:10: collect_key ^ LEFT_PAREN ! ( distinct_key | unique_key )? column_name ( collect_order_by_part )? RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_collect_key_in_standard_function10235);
                    collect_key743=gPLSQLParser.collect_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(collect_key743.getTree(), root_0);

                    LEFT_PAREN744=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10250); if (state.failed) return retval;

                    // PLSQL_DMLParser.g:1051:17: ( distinct_key | unique_key )?
                    int alt237=3;
                    int LA237_0 = input.LA(1);

                    if ( (LA237_0==SQL92_RESERVED_DISTINCT) ) {
                        alt237=1;
                    }
                    else if ( (LA237_0==SQL92_RESERVED_UNIQUE) ) {
                        alt237=2;
                    }
                    switch (alt237) {
                        case 1 :
                            // PLSQL_DMLParser.g:1051:18: distinct_key
                            {
                            pushFollow(FOLLOW_distinct_key_in_standard_function10271);
                            distinct_key745=gPLSQLParser.distinct_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, distinct_key745.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1051:31: unique_key
                            {
                            pushFollow(FOLLOW_unique_key_in_standard_function10273);
                            unique_key746=gPLSQLParser.unique_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, unique_key746.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_column_name_in_standard_function10277);
                    column_name747=gPLSQLParser.column_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, column_name747.getTree());

                    // PLSQL_DMLParser.g:1051:56: ( collect_order_by_part )?
                    int alt238=2;
                    int LA238_0 = input.LA(1);

                    if ( (LA238_0==SQL92_RESERVED_ORDER) ) {
                        alt238=1;
                    }
                    switch (alt238) {
                        case 1 :
                            // PLSQL_DMLParser.g:1051:56: collect_order_by_part
                            {
                            pushFollow(FOLLOW_collect_order_by_part_in_standard_function10279);
                            collect_order_by_part748=collect_order_by_part();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, collect_order_by_part748.getTree());

                            }
                            break;

                    }


                    RIGHT_PAREN749=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function10294); if (state.failed) return retval;

                    }
                    break;
                case 7 :
                    // PLSQL_DMLParser.g:1053:10: stantard_function_enabling_within_or_over ^ function_argument ( within_or_over_part )+
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_stantard_function_enabling_within_or_over_in_standard_function10306);
                    stantard_function_enabling_within_or_over750=stantard_function_enabling_within_or_over();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(stantard_function_enabling_within_or_over750.getTree(), root_0);

                    pushFollow(FOLLOW_function_argument_in_standard_function10322);
                    function_argument751=gPLSQLParser.function_argument();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, function_argument751.getTree());

                    // PLSQL_DMLParser.g:1054:31: ( within_or_over_part )+
                    int cnt239=0;
                    loop239:
                    do {
                        int alt239=2;
                        int LA239_0 = input.LA(1);

                        if ( (LA239_0==REGULAR_ID) ) {
                            int LA239_1 = input.LA(2);

                            if ( (LA239_1==LEFT_PAREN) ) {
                                int LA239_3 = input.LA(3);

                                if ( (LA239_3==REGULAR_ID) ) {
                                    int LA239_11 = input.LA(4);

                                    if ( (LA239_11==SQL92_RESERVED_BY) && ((input.LT(1).getText().equalsIgnoreCase("over")))) {
                                        alt239=1;
                                    }


                                }
                                else if ( (LA239_3==RIGHT_PAREN||LA239_3==SQL92_RESERVED_ORDER) && ((input.LT(1).getText().equalsIgnoreCase("over")))) {
                                    alt239=1;
                                }


                            }
                            else if ( (LA239_1==SQL92_RESERVED_GROUP) ) {
                                int LA239_4 = input.LA(3);

                                if ( (LA239_4==LEFT_PAREN) && ((input.LT(1).getText().equalsIgnoreCase("within")))) {
                                    alt239=1;
                                }


                            }


                        }


                        switch (alt239) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:1054:31: within_or_over_part
                    	    {
                    	    pushFollow(FOLLOW_within_or_over_part_in_standard_function10324);
                    	    within_or_over_part752=within_or_over_part();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) adaptor.addChild(root_0, within_or_over_part752.getTree());

                    	    }
                    	    break;

                    	default :
                    	    if ( cnt239 >= 1 ) break loop239;
                    	    if (state.backtracking>0) {state.failed=true; return retval;}
                                EarlyExitException eee =
                                    new EarlyExitException(239, input);
                                throw eee;
                        }
                        cnt239++;
                    } while (true);


                    }
                    break;
                case 8 :
                    // PLSQL_DMLParser.g:1055:10: decompose_key ^ LEFT_PAREN ! concatenation_wrapper ( canonical_key | compatibility_key )? RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_decompose_key_in_standard_function10336);
                    decompose_key753=gPLSQLParser.decompose_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(decompose_key753.getTree(), root_0);

                    LEFT_PAREN754=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10351); if (state.failed) return retval;

                    pushFollow(FOLLOW_concatenation_wrapper_in_standard_function10371);
                    concatenation_wrapper755=concatenation_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper755.getTree());

                    // PLSQL_DMLParser.g:1057:39: ( canonical_key | compatibility_key )?
                    int alt240=3;
                    int LA240_0 = input.LA(1);

                    if ( (LA240_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("canonical"))||(input.LT(1).getText().equalsIgnoreCase("compatibility"))))) {
                        int LA240_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("canonical"))) ) {
                            alt240=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("compatibility"))) ) {
                            alt240=2;
                        }
                    }
                    switch (alt240) {
                        case 1 :
                            // PLSQL_DMLParser.g:1057:40: canonical_key
                            {
                            pushFollow(FOLLOW_canonical_key_in_standard_function10374);
                            canonical_key756=gPLSQLParser.canonical_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, canonical_key756.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1057:54: compatibility_key
                            {
                            pushFollow(FOLLOW_compatibility_key_in_standard_function10376);
                            compatibility_key757=gPLSQLParser.compatibility_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, compatibility_key757.getTree());

                            }
                            break;

                    }


                    RIGHT_PAREN758=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function10393); if (state.failed) return retval;

                    }
                    break;
                case 9 :
                    // PLSQL_DMLParser.g:1059:10: extract_key ^ LEFT_PAREN ! REGULAR_ID from_key ! concatenation_wrapper RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_extract_key_in_standard_function10405);
                    extract_key759=gPLSQLParser.extract_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(extract_key759.getTree(), root_0);

                    LEFT_PAREN760=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10420); if (state.failed) return retval;

                    REGULAR_ID761=(Token)match(input,REGULAR_ID,FOLLOW_REGULAR_ID_in_standard_function10439); if (state.failed) return retval;
                    if ( state.backtracking==0 ) {
                    REGULAR_ID761_tree = 
                    (Object)adaptor.create(REGULAR_ID761)
                    ;
                    adaptor.addChild(root_0, REGULAR_ID761_tree);
                    }

                    pushFollow(FOLLOW_from_key_in_standard_function10441);
                    from_key762=gPLSQLParser.from_key();

                    state._fsp--;
                    if (state.failed) return retval;

                    pushFollow(FOLLOW_concatenation_wrapper_in_standard_function10444);
                    concatenation_wrapper763=concatenation_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper763.getTree());

                    RIGHT_PAREN764=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function10459); if (state.failed) return retval;

                    }
                    break;
                case 10 :
                    // PLSQL_DMLParser.g:1063:10: ( first_value_key ^| last_value_key ^) LEFT_PAREN ! concatenation_wrapper ( ignore_key ! nulls_key )? RIGHT_PAREN ! over_clause
                    {
                    root_0 = (Object)adaptor.nil();


                    // PLSQL_DMLParser.g:1063:10: ( first_value_key ^| last_value_key ^)
                    int alt241=2;
                    int LA241_0 = input.LA(1);

                    if ( (LA241_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("first_value"))||(input.LT(1).getText().equalsIgnoreCase("last_value"))))) {
                        int LA241_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("first_value"))) ) {
                            alt241=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("last_value"))) ) {
                            alt241=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 241, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 241, 0, input);

                        throw nvae;

                    }
                    switch (alt241) {
                        case 1 :
                            // PLSQL_DMLParser.g:1063:11: first_value_key ^
                            {
                            pushFollow(FOLLOW_first_value_key_in_standard_function10472);
                            first_value_key765=gPLSQLParser.first_value_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(first_value_key765.getTree(), root_0);

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1063:28: last_value_key ^
                            {
                            pushFollow(FOLLOW_last_value_key_in_standard_function10475);
                            last_value_key766=gPLSQLParser.last_value_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(last_value_key766.getTree(), root_0);

                            }
                            break;

                    }


                    LEFT_PAREN767=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10492); if (state.failed) return retval;

                    pushFollow(FOLLOW_concatenation_wrapper_in_standard_function10511);
                    concatenation_wrapper768=concatenation_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper768.getTree());

                    // PLSQL_DMLParser.g:1065:39: ( ignore_key ! nulls_key )?
                    int alt242=2;
                    int LA242_0 = input.LA(1);

                    if ( (LA242_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("ignore")))) {
                        alt242=1;
                    }
                    switch (alt242) {
                        case 1 :
                            // PLSQL_DMLParser.g:1065:40: ignore_key ! nulls_key
                            {
                            pushFollow(FOLLOW_ignore_key_in_standard_function10514);
                            ignore_key769=gPLSQLParser.ignore_key();

                            state._fsp--;
                            if (state.failed) return retval;

                            pushFollow(FOLLOW_nulls_key_in_standard_function10517);
                            nulls_key770=gPLSQLParser.nulls_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, nulls_key770.getTree());

                            }
                            break;

                    }


                    RIGHT_PAREN771=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function10534); if (state.failed) return retval;

                    pushFollow(FOLLOW_over_clause_in_standard_function10537);
                    over_clause772=over_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, over_clause772.getTree());

                    }
                    break;
                case 11 :
                    // PLSQL_DMLParser.g:1067:10: stantard_function_pedictions ^ LEFT_PAREN ! expression_wrapper ( COMMA expression_wrapper )* ( cost_matrix_clause )? ( using_clause )? RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_stantard_function_pedictions_in_standard_function10548);
                    stantard_function_pedictions773=stantard_function_pedictions();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(stantard_function_pedictions773.getTree(), root_0);

                    LEFT_PAREN774=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10563); if (state.failed) return retval;

                    pushFollow(FOLLOW_expression_wrapper_in_standard_function10582);
                    expression_wrapper775=expression_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper775.getTree());

                    // PLSQL_DMLParser.g:1069:36: ( COMMA expression_wrapper )*
                    loop243:
                    do {
                        int alt243=2;
                        int LA243_0 = input.LA(1);

                        if ( (LA243_0==COMMA) ) {
                            alt243=1;
                        }


                        switch (alt243) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:1069:37: COMMA expression_wrapper
                    	    {
                    	    COMMA776=(Token)match(input,COMMA,FOLLOW_COMMA_in_standard_function10585); if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) {
                    	    COMMA776_tree = 
                    	    (Object)adaptor.create(COMMA776)
                    	    ;
                    	    adaptor.addChild(root_0, COMMA776_tree);
                    	    }

                    	    pushFollow(FOLLOW_expression_wrapper_in_standard_function10587);
                    	    expression_wrapper777=expression_wrapper();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper777.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop243;
                        }
                    } while (true);


                    // PLSQL_DMLParser.g:1069:64: ( cost_matrix_clause )?
                    int alt244=2;
                    int LA244_0 = input.LA(1);

                    if ( (LA244_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("cost")))) {
                        alt244=1;
                    }
                    switch (alt244) {
                        case 1 :
                            // PLSQL_DMLParser.g:1069:64: cost_matrix_clause
                            {
                            pushFollow(FOLLOW_cost_matrix_clause_in_standard_function10591);
                            cost_matrix_clause778=cost_matrix_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, cost_matrix_clause778.getTree());

                            }
                            break;

                    }


                    // PLSQL_DMLParser.g:1069:84: ( using_clause )?
                    int alt245=2;
                    int LA245_0 = input.LA(1);

                    if ( (LA245_0==PLSQL_NON_RESERVED_USING) ) {
                        alt245=1;
                    }
                    switch (alt245) {
                        case 1 :
                            // PLSQL_DMLParser.g:1069:84: using_clause
                            {
                            pushFollow(FOLLOW_using_clause_in_standard_function10594);
                            using_clause779=using_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, using_clause779.getTree());

                            }
                            break;

                    }


                    RIGHT_PAREN780=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function10610); if (state.failed) return retval;

                    }
                    break;
                case 12 :
                    // PLSQL_DMLParser.g:1071:10: translate_key ^ LEFT_PAREN ! expression_wrapper ( using_key ! ( char_cs_key | nchar_cs_key ) )? ( COMMA expression_wrapper )* RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_translate_key_in_standard_function10622);
                    translate_key781=gPLSQLParser.translate_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(translate_key781.getTree(), root_0);

                    LEFT_PAREN782=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10637); if (state.failed) return retval;

                    pushFollow(FOLLOW_expression_wrapper_in_standard_function10657);
                    expression_wrapper783=expression_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper783.getTree());

                    // PLSQL_DMLParser.g:1073:36: ( using_key ! ( char_cs_key | nchar_cs_key ) )?
                    int alt247=2;
                    int LA247_0 = input.LA(1);

                    if ( (LA247_0==PLSQL_NON_RESERVED_USING) ) {
                        alt247=1;
                    }
                    switch (alt247) {
                        case 1 :
                            // PLSQL_DMLParser.g:1073:37: using_key ! ( char_cs_key | nchar_cs_key )
                            {
                            pushFollow(FOLLOW_using_key_in_standard_function10660);
                            using_key784=gPLSQLParser.using_key();

                            state._fsp--;
                            if (state.failed) return retval;

                            // PLSQL_DMLParser.g:1073:48: ( char_cs_key | nchar_cs_key )
                            int alt246=2;
                            int LA246_0 = input.LA(1);

                            if ( (LA246_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("char_cs"))||(input.LT(1).getText().equalsIgnoreCase("nchar_cs"))))) {
                                int LA246_1 = input.LA(2);

                                if ( ((input.LT(1).getText().equalsIgnoreCase("char_cs"))) ) {
                                    alt246=1;
                                }
                                else if ( ((input.LT(1).getText().equalsIgnoreCase("nchar_cs"))) ) {
                                    alt246=2;
                                }
                                else {
                                    if (state.backtracking>0) {state.failed=true; return retval;}
                                    NoViableAltException nvae =
                                        new NoViableAltException("", 246, 1, input);

                                    throw nvae;

                                }
                            }
                            else {
                                if (state.backtracking>0) {state.failed=true; return retval;}
                                NoViableAltException nvae =
                                    new NoViableAltException("", 246, 0, input);

                                throw nvae;

                            }
                            switch (alt246) {
                                case 1 :
                                    // PLSQL_DMLParser.g:1073:49: char_cs_key
                                    {
                                    pushFollow(FOLLOW_char_cs_key_in_standard_function10664);
                                    char_cs_key785=gPLSQLParser.char_cs_key();

                                    state._fsp--;
                                    if (state.failed) return retval;
                                    if ( state.backtracking==0 ) adaptor.addChild(root_0, char_cs_key785.getTree());

                                    }
                                    break;
                                case 2 :
                                    // PLSQL_DMLParser.g:1073:61: nchar_cs_key
                                    {
                                    pushFollow(FOLLOW_nchar_cs_key_in_standard_function10666);
                                    nchar_cs_key786=gPLSQLParser.nchar_cs_key();

                                    state._fsp--;
                                    if (state.failed) return retval;
                                    if ( state.backtracking==0 ) adaptor.addChild(root_0, nchar_cs_key786.getTree());

                                    }
                                    break;

                            }


                            }
                            break;

                    }


                    // PLSQL_DMLParser.g:1074:21: ( COMMA expression_wrapper )*
                    loop248:
                    do {
                        int alt248=2;
                        int LA248_0 = input.LA(1);

                        if ( (LA248_0==COMMA) ) {
                            alt248=1;
                        }


                        switch (alt248) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:1074:22: COMMA expression_wrapper
                    	    {
                    	    COMMA787=(Token)match(input,COMMA,FOLLOW_COMMA_in_standard_function10693); if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) {
                    	    COMMA787_tree = 
                    	    (Object)adaptor.create(COMMA787)
                    	    ;
                    	    adaptor.addChild(root_0, COMMA787_tree);
                    	    }

                    	    pushFollow(FOLLOW_expression_wrapper_in_standard_function10695);
                    	    expression_wrapper788=expression_wrapper();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper788.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop248;
                        }
                    } while (true);


                    RIGHT_PAREN789=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function10712); if (state.failed) return retval;

                    }
                    break;
                case 13 :
                    // PLSQL_DMLParser.g:1076:10: treat_key ^ LEFT_PAREN ! expression_wrapper as_key ! ( ref_key )? type_spec RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_treat_key_in_standard_function10724);
                    treat_key790=gPLSQLParser.treat_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(treat_key790.getTree(), root_0);

                    LEFT_PAREN791=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10739); if (state.failed) return retval;

                    pushFollow(FOLLOW_expression_wrapper_in_standard_function10758);
                    expression_wrapper792=expression_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper792.getTree());

                    pushFollow(FOLLOW_as_key_in_standard_function10760);
                    as_key793=gPLSQLParser.as_key();

                    state._fsp--;
                    if (state.failed) return retval;

                    // PLSQL_DMLParser.g:1078:44: ( ref_key )?
                    int alt249=2;
                    int LA249_0 = input.LA(1);

                    if ( (LA249_0==REGULAR_ID) ) {
                        int LA249_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("ref"))) ) {
                            alt249=1;
                        }
                    }
                    switch (alt249) {
                        case 1 :
                            // PLSQL_DMLParser.g:1078:44: ref_key
                            {
                            pushFollow(FOLLOW_ref_key_in_standard_function10763);
                            ref_key794=gPLSQLParser.ref_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, ref_key794.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_type_spec_in_standard_function10766);
                    type_spec795=gPLSQLParser.type_spec();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, type_spec795.getTree());

                    RIGHT_PAREN796=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function10781); if (state.failed) return retval;

                    }
                    break;
                case 14 :
                    // PLSQL_DMLParser.g:1080:10: trim_key ^ LEFT_PAREN ! ( ( leading_key | trailing_key | both_key )? concatenation_wrapper from_key !)? concatenation_wrapper RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_trim_key_in_standard_function10793);
                    trim_key797=gPLSQLParser.trim_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(trim_key797.getTree(), root_0);

                    LEFT_PAREN798=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10808); if (state.failed) return retval;

                    // PLSQL_DMLParser.g:1082:17: ( ( leading_key | trailing_key | both_key )? concatenation_wrapper from_key !)?
                    int alt251=2;
                    switch ( input.LA(1) ) {
                        case REGULAR_ID:
                            {
                            alt251=1;
                            }
                            break;
                        case MINUS_SIGN:
                            {
                            alt251=1;
                            }
                            break;
                        case PLUS_SIGN:
                            {
                            alt251=1;
                            }
                            break;
                        case SQL92_RESERVED_PRIOR:
                            {
                            alt251=1;
                            }
                            break;
                        case SQL92_RESERVED_DISTINCT:
                            {
                            alt251=1;
                            }
                            break;
                        case SQL92_RESERVED_ALL:
                            {
                            alt251=1;
                            }
                            break;
                        case DELIMITED_ID:
                            {
                            alt251=1;
                            }
                            break;
                        case SQL92_RESERVED_CASE:
                            {
                            int LA251_8 = input.LA(2);

                            if ( (((input.LA(1) == SQL92_RESERVED_CASE || input.LA(2) == SQL92_RESERVED_CASE))) ) {
                                alt251=1;
                            }
                            }
                            break;
                        case SQL92_RESERVED_EXISTS:
                            {
                            alt251=1;
                            }
                            break;
                        case SQL92_RESERVED_ANY:
                            {
                            alt251=1;
                            }
                            break;
                        case APPROXIMATE_NUM_LIT:
                        case EXACT_NUM_LIT:
                        case UNSIGNED_INTEGER:
                            {
                            alt251=1;
                            }
                            break;
                        case CHAR_STRING:
                            {
                            alt251=1;
                            }
                            break;
                        case SQL92_RESERVED_NULL:
                            {
                            alt251=1;
                            }
                            break;
                        case SQL92_RESERVED_TRUE:
                            {
                            alt251=1;
                            }
                            break;
                        case SQL92_RESERVED_FALSE:
                            {
                            alt251=1;
                            }
                            break;
                        case SQL92_RESERVED_DEFAULT:
                            {
                            alt251=1;
                            }
                            break;
                        case INTRODUCER:
                            {
                            alt251=1;
                            }
                            break;
                        case COLON:
                            {
                            alt251=1;
                            }
                            break;
                        case LEFT_PAREN:
                            {
                            alt251=1;
                            }
                            break;
                    }

                    switch (alt251) {
                        case 1 :
                            // PLSQL_DMLParser.g:1082:18: ( leading_key | trailing_key | both_key )? concatenation_wrapper from_key !
                            {
                            // PLSQL_DMLParser.g:1082:18: ( leading_key | trailing_key | both_key )?
                            int alt250=4;
                            int LA250_0 = input.LA(1);

                            if ( (LA250_0==REGULAR_ID) ) {
                                int LA250_1 = input.LA(2);

                                if ( ((input.LT(1).getText().equalsIgnoreCase("leading"))) ) {
                                    alt250=1;
                                }
                                else if ( ((input.LT(1).getText().equalsIgnoreCase("trailing"))) ) {
                                    alt250=2;
                                }
                                else if ( ((input.LT(1).getText().equalsIgnoreCase("both"))) ) {
                                    alt250=3;
                                }
                            }
                            switch (alt250) {
                                case 1 :
                                    // PLSQL_DMLParser.g:1082:19: leading_key
                                    {
                                    pushFollow(FOLLOW_leading_key_in_standard_function10830);
                                    leading_key799=gPLSQLParser.leading_key();

                                    state._fsp--;
                                    if (state.failed) return retval;
                                    if ( state.backtracking==0 ) adaptor.addChild(root_0, leading_key799.getTree());

                                    }
                                    break;
                                case 2 :
                                    // PLSQL_DMLParser.g:1082:31: trailing_key
                                    {
                                    pushFollow(FOLLOW_trailing_key_in_standard_function10832);
                                    trailing_key800=gPLSQLParser.trailing_key();

                                    state._fsp--;
                                    if (state.failed) return retval;
                                    if ( state.backtracking==0 ) adaptor.addChild(root_0, trailing_key800.getTree());

                                    }
                                    break;
                                case 3 :
                                    // PLSQL_DMLParser.g:1082:44: both_key
                                    {
                                    pushFollow(FOLLOW_both_key_in_standard_function10834);
                                    both_key801=gPLSQLParser.both_key();

                                    state._fsp--;
                                    if (state.failed) return retval;
                                    if ( state.backtracking==0 ) adaptor.addChild(root_0, both_key801.getTree());

                                    }
                                    break;

                            }


                            pushFollow(FOLLOW_concatenation_wrapper_in_standard_function10838);
                            concatenation_wrapper802=concatenation_wrapper();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper802.getTree());

                            pushFollow(FOLLOW_from_key_in_standard_function10840);
                            from_key803=gPLSQLParser.from_key();

                            state._fsp--;
                            if (state.failed) return retval;

                            }
                            break;

                    }


                    pushFollow(FOLLOW_concatenation_wrapper_in_standard_function10845);
                    concatenation_wrapper804=concatenation_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper804.getTree());

                    RIGHT_PAREN805=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function10860); if (state.failed) return retval;

                    }
                    break;
                case 15 :
                    // PLSQL_DMLParser.g:1084:10: xmlagg_key ^ LEFT_PAREN ! expression_wrapper ( order_by_clause )? RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_xmlagg_key_in_standard_function10872);
                    xmlagg_key806=gPLSQLParser.xmlagg_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmlagg_key806.getTree(), root_0);

                    LEFT_PAREN807=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10887); if (state.failed) return retval;

                    pushFollow(FOLLOW_expression_wrapper_in_standard_function10907);
                    expression_wrapper808=expression_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper808.getTree());

                    // PLSQL_DMLParser.g:1086:36: ( order_by_clause )?
                    int alt252=2;
                    int LA252_0 = input.LA(1);

                    if ( (LA252_0==SQL92_RESERVED_ORDER) ) {
                        alt252=1;
                    }
                    switch (alt252) {
                        case 1 :
                            // PLSQL_DMLParser.g:1086:36: order_by_clause
                            {
                            pushFollow(FOLLOW_order_by_clause_in_standard_function10909);
                            order_by_clause809=order_by_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, order_by_clause809.getTree());

                            }
                            break;

                    }


                    RIGHT_PAREN810=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function10925); if (state.failed) return retval;

                    }
                    break;
                case 16 :
                    // PLSQL_DMLParser.g:1088:10: ( xmlcolattval_key ^| xmlforest_key ^) LEFT_PAREN ! xml_multiuse_expression_element ( COMMA ! xml_multiuse_expression_element )* RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    // PLSQL_DMLParser.g:1088:10: ( xmlcolattval_key ^| xmlforest_key ^)
                    int alt253=2;
                    int LA253_0 = input.LA(1);

                    if ( (LA253_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("xmlcolattval"))||(input.LT(1).getText().equalsIgnoreCase("xmlforest"))))) {
                        int LA253_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("xmlcolattval"))) ) {
                            alt253=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("xmlforest"))) ) {
                            alt253=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 253, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 253, 0, input);

                        throw nvae;

                    }
                    switch (alt253) {
                        case 1 :
                            // PLSQL_DMLParser.g:1088:11: xmlcolattval_key ^
                            {
                            pushFollow(FOLLOW_xmlcolattval_key_in_standard_function10938);
                            xmlcolattval_key811=gPLSQLParser.xmlcolattval_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmlcolattval_key811.getTree(), root_0);

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1088:29: xmlforest_key ^
                            {
                            pushFollow(FOLLOW_xmlforest_key_in_standard_function10941);
                            xmlforest_key812=gPLSQLParser.xmlforest_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmlforest_key812.getTree(), root_0);

                            }
                            break;

                    }


                    LEFT_PAREN813=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function10958); if (state.failed) return retval;

                    pushFollow(FOLLOW_xml_multiuse_expression_element_in_standard_function10977);
                    xml_multiuse_expression_element814=xml_multiuse_expression_element();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, xml_multiuse_expression_element814.getTree());

                    // PLSQL_DMLParser.g:1090:49: ( COMMA ! xml_multiuse_expression_element )*
                    loop254:
                    do {
                        int alt254=2;
                        int LA254_0 = input.LA(1);

                        if ( (LA254_0==COMMA) ) {
                            alt254=1;
                        }


                        switch (alt254) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:1090:50: COMMA ! xml_multiuse_expression_element
                    	    {
                    	    COMMA815=(Token)match(input,COMMA,FOLLOW_COMMA_in_standard_function10980); if (state.failed) return retval;

                    	    pushFollow(FOLLOW_xml_multiuse_expression_element_in_standard_function10983);
                    	    xml_multiuse_expression_element816=xml_multiuse_expression_element();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) adaptor.addChild(root_0, xml_multiuse_expression_element816.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop254;
                        }
                    } while (true);


                    RIGHT_PAREN817=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function10999); if (state.failed) return retval;

                    }
                    break;
                case 17 :
                    // PLSQL_DMLParser.g:1092:10: xmlelement_key ^ LEFT_PAREN ! ( entityescaping_key | noentityescaping_key )? ( name_key | evalname_key )? expression_wrapper ({...}? COMMA ! xml_attributes_clause )? ( COMMA ! expression_wrapper ( alias )? )* RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_xmlelement_key_in_standard_function11011);
                    xmlelement_key818=gPLSQLParser.xmlelement_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmlelement_key818.getTree(), root_0);

                    LEFT_PAREN819=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function11026); if (state.failed) return retval;

                    // PLSQL_DMLParser.g:1094:17: ( entityescaping_key | noentityescaping_key )?
                    int alt255=3;
                    int LA255_0 = input.LA(1);

                    if ( (LA255_0==REGULAR_ID) ) {
                        int LA255_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("entityescaping"))) ) {
                            alt255=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("noentityescaping"))) ) {
                            alt255=2;
                        }
                    }
                    switch (alt255) {
                        case 1 :
                            // PLSQL_DMLParser.g:1094:18: entityescaping_key
                            {
                            pushFollow(FOLLOW_entityescaping_key_in_standard_function11046);
                            entityescaping_key820=gPLSQLParser.entityescaping_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, entityescaping_key820.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1094:37: noentityescaping_key
                            {
                            pushFollow(FOLLOW_noentityescaping_key_in_standard_function11048);
                            noentityescaping_key821=gPLSQLParser.noentityescaping_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, noentityescaping_key821.getTree());

                            }
                            break;

                    }


                    // PLSQL_DMLParser.g:1095:17: ( name_key | evalname_key )?
                    int alt256=3;
                    int LA256_0 = input.LA(1);

                    if ( (LA256_0==REGULAR_ID) ) {
                        int LA256_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("name"))) ) {
                            alt256=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("evalname"))) ) {
                            alt256=2;
                        }
                    }
                    switch (alt256) {
                        case 1 :
                            // PLSQL_DMLParser.g:1095:18: name_key
                            {
                            pushFollow(FOLLOW_name_key_in_standard_function11069);
                            name_key822=gPLSQLParser.name_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, name_key822.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1095:27: evalname_key
                            {
                            pushFollow(FOLLOW_evalname_key_in_standard_function11071);
                            evalname_key823=gPLSQLParser.evalname_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, evalname_key823.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_expression_wrapper_in_standard_function11075);
                    expression_wrapper824=expression_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper824.getTree());

                    // PLSQL_DMLParser.g:1096:17: ({...}? COMMA ! xml_attributes_clause )?
                    int alt257=2;
                    int LA257_0 = input.LA(1);

                    if ( (LA257_0==COMMA) ) {
                        int LA257_1 = input.LA(2);

                        if ( ((input.LT(2).getText().equalsIgnoreCase("xmlattributes"))) ) {
                            alt257=1;
                        }
                    }
                    switch (alt257) {
                        case 1 :
                            // PLSQL_DMLParser.g:1096:18: {...}? COMMA ! xml_attributes_clause
                            {
                            if ( !((input.LT(2).getText().equalsIgnoreCase("xmlattributes"))) ) {
                                if (state.backtracking>0) {state.failed=true; return retval;}
                                throw new FailedPredicateException(input, "standard_function", "input.LT(2).getText().equalsIgnoreCase(\"xmlattributes\")");
                            }

                            COMMA825=(Token)match(input,COMMA,FOLLOW_COMMA_in_standard_function11096); if (state.failed) return retval;

                            pushFollow(FOLLOW_xml_attributes_clause_in_standard_function11099);
                            xml_attributes_clause826=xml_attributes_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, xml_attributes_clause826.getTree());

                            }
                            break;

                    }


                    // PLSQL_DMLParser.g:1097:17: ( COMMA ! expression_wrapper ( alias )? )*
                    loop259:
                    do {
                        int alt259=2;
                        int LA259_0 = input.LA(1);

                        if ( (LA259_0==COMMA) ) {
                            alt259=1;
                        }


                        switch (alt259) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:1097:18: COMMA ! expression_wrapper ( alias )?
                    	    {
                    	    COMMA827=(Token)match(input,COMMA,FOLLOW_COMMA_in_standard_function11120); if (state.failed) return retval;

                    	    pushFollow(FOLLOW_expression_wrapper_in_standard_function11123);
                    	    expression_wrapper828=expression_wrapper();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper828.getTree());

                    	    // PLSQL_DMLParser.g:1097:44: ( alias )?
                    	    int alt258=2;
                    	    int LA258_0 = input.LA(1);

                    	    if ( (LA258_0==CHAR_STRING||LA258_0==DELIMITED_ID||LA258_0==INTRODUCER||LA258_0==REGULAR_ID||LA258_0==SQL92_RESERVED_AS) ) {
                    	        alt258=1;
                    	    }
                    	    switch (alt258) {
                    	        case 1 :
                    	            // PLSQL_DMLParser.g:1097:44: alias
                    	            {
                    	            pushFollow(FOLLOW_alias_in_standard_function11125);
                    	            alias829=gPLSQLParser.alias();

                    	            state._fsp--;
                    	            if (state.failed) return retval;
                    	            if ( state.backtracking==0 ) adaptor.addChild(root_0, alias829.getTree());

                    	            }
                    	            break;

                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop259;
                        }
                    } while (true);


                    RIGHT_PAREN830=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function11142); if (state.failed) return retval;

                    }
                    break;
                case 18 :
                    // PLSQL_DMLParser.g:1099:10: xmlexists_key ^ LEFT_PAREN ! expression_wrapper ( xml_passing_clause )? RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_xmlexists_key_in_standard_function11154);
                    xmlexists_key831=gPLSQLParser.xmlexists_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmlexists_key831.getTree(), root_0);

                    LEFT_PAREN832=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function11169); if (state.failed) return retval;

                    pushFollow(FOLLOW_expression_wrapper_in_standard_function11188);
                    expression_wrapper833=expression_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper833.getTree());

                    // PLSQL_DMLParser.g:1102:17: ( xml_passing_clause )?
                    int alt260=2;
                    int LA260_0 = input.LA(1);

                    if ( (LA260_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("passing")))) {
                        alt260=1;
                    }
                    switch (alt260) {
                        case 1 :
                            // PLSQL_DMLParser.g:1102:17: xml_passing_clause
                            {
                            pushFollow(FOLLOW_xml_passing_clause_in_standard_function11206);
                            xml_passing_clause834=xml_passing_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, xml_passing_clause834.getTree());

                            }
                            break;

                    }


                    RIGHT_PAREN835=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function11221); if (state.failed) return retval;

                    }
                    break;
                case 19 :
                    // PLSQL_DMLParser.g:1104:10: xmlparse_key ^ LEFT_PAREN ! ( document_key | content_key ) concatenation_wrapper ( wellformed_key )? RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_xmlparse_key_in_standard_function11233);
                    xmlparse_key836=gPLSQLParser.xmlparse_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmlparse_key836.getTree(), root_0);

                    LEFT_PAREN837=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function11248); if (state.failed) return retval;

                    // PLSQL_DMLParser.g:1106:17: ( document_key | content_key )
                    int alt261=2;
                    int LA261_0 = input.LA(1);

                    if ( (LA261_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("document"))||(input.LT(1).getText().equalsIgnoreCase("content"))))) {
                        int LA261_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("document"))) ) {
                            alt261=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("content"))) ) {
                            alt261=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 261, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 261, 0, input);

                        throw nvae;

                    }
                    switch (alt261) {
                        case 1 :
                            // PLSQL_DMLParser.g:1106:18: document_key
                            {
                            pushFollow(FOLLOW_document_key_in_standard_function11269);
                            document_key838=gPLSQLParser.document_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, document_key838.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1106:31: content_key
                            {
                            pushFollow(FOLLOW_content_key_in_standard_function11271);
                            content_key839=gPLSQLParser.content_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, content_key839.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_concatenation_wrapper_in_standard_function11274);
                    concatenation_wrapper840=concatenation_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper840.getTree());

                    // PLSQL_DMLParser.g:1106:66: ( wellformed_key )?
                    int alt262=2;
                    int LA262_0 = input.LA(1);

                    if ( (LA262_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("wellformed")))) {
                        alt262=1;
                    }
                    switch (alt262) {
                        case 1 :
                            // PLSQL_DMLParser.g:1106:66: wellformed_key
                            {
                            pushFollow(FOLLOW_wellformed_key_in_standard_function11276);
                            wellformed_key841=gPLSQLParser.wellformed_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, wellformed_key841.getTree());

                            }
                            break;

                    }


                    RIGHT_PAREN842=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function11291); if (state.failed) return retval;

                    }
                    break;
                case 20 :
                    // PLSQL_DMLParser.g:1108:10: xmlpi_key ^ LEFT_PAREN ! ( name_key id | evalname_key concatenation_wrapper ) ( COMMA ! concatenation_wrapper )? RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_xmlpi_key_in_standard_function11303);
                    xmlpi_key843=gPLSQLParser.xmlpi_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmlpi_key843.getTree(), root_0);

                    LEFT_PAREN844=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function11318); if (state.failed) return retval;

                    // PLSQL_DMLParser.g:1110:17: ( name_key id | evalname_key concatenation_wrapper )
                    int alt263=2;
                    alt263 = dfa263.predict(input);
                    switch (alt263) {
                        case 1 :
                            // PLSQL_DMLParser.g:1110:22: name_key id
                            {
                            pushFollow(FOLLOW_name_key_in_standard_function11343);
                            name_key845=gPLSQLParser.name_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, name_key845.getTree());

                            pushFollow(FOLLOW_id_in_standard_function11345);
                            id846=gPLSQLParser.id();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, id846.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1111:22: evalname_key concatenation_wrapper
                            {
                            pushFollow(FOLLOW_evalname_key_in_standard_function11368);
                            evalname_key847=gPLSQLParser.evalname_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, evalname_key847.getTree());

                            pushFollow(FOLLOW_concatenation_wrapper_in_standard_function11370);
                            concatenation_wrapper848=concatenation_wrapper();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper848.getTree());

                            }
                            break;

                    }


                    // PLSQL_DMLParser.g:1113:17: ( COMMA ! concatenation_wrapper )?
                    int alt264=2;
                    int LA264_0 = input.LA(1);

                    if ( (LA264_0==COMMA) ) {
                        alt264=1;
                    }
                    switch (alt264) {
                        case 1 :
                            // PLSQL_DMLParser.g:1113:18: COMMA ! concatenation_wrapper
                            {
                            COMMA849=(Token)match(input,COMMA,FOLLOW_COMMA_in_standard_function11407); if (state.failed) return retval;

                            pushFollow(FOLLOW_concatenation_wrapper_in_standard_function11410);
                            concatenation_wrapper850=concatenation_wrapper();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper850.getTree());

                            }
                            break;

                    }


                    RIGHT_PAREN851=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function11426); if (state.failed) return retval;

                    }
                    break;
                case 21 :
                    // PLSQL_DMLParser.g:1115:10: xmlquery_key ^ LEFT_PAREN ! concatenation_wrapper ( xml_passing_clause )? returning_key ! content_key ! ( null_key on_key ! empty_key !)? RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_xmlquery_key_in_standard_function11438);
                    xmlquery_key852=gPLSQLParser.xmlquery_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmlquery_key852.getTree(), root_0);

                    LEFT_PAREN853=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function11453); if (state.failed) return retval;

                    pushFollow(FOLLOW_concatenation_wrapper_in_standard_function11473);
                    concatenation_wrapper854=concatenation_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper854.getTree());

                    // PLSQL_DMLParser.g:1117:39: ( xml_passing_clause )?
                    int alt265=2;
                    int LA265_0 = input.LA(1);

                    if ( (LA265_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("returning"))||(input.LT(1).getText().equalsIgnoreCase("passing"))))) {
                        int LA265_1 = input.LA(2);

                        if ( (LA265_1==APPROXIMATE_NUM_LIT||(LA265_1 >= CHAR_STRING && LA265_1 <= COLON)||LA265_1==DELIMITED_ID||LA265_1==EXACT_NUM_LIT||LA265_1==INTRODUCER||LA265_1==LEFT_PAREN||LA265_1==MINUS_SIGN||LA265_1==PLUS_SIGN||LA265_1==SQL92_RESERVED_ALL||LA265_1==SQL92_RESERVED_ANY||(LA265_1 >= SQL92_RESERVED_BY && LA265_1 <= SQL92_RESERVED_CASE)||LA265_1==SQL92_RESERVED_DEFAULT||LA265_1==SQL92_RESERVED_DISTINCT||(LA265_1 >= SQL92_RESERVED_EXISTS && LA265_1 <= SQL92_RESERVED_FALSE)||(LA265_1 >= SQL92_RESERVED_NOT && LA265_1 <= SQL92_RESERVED_NULL)||LA265_1==SQL92_RESERVED_PRIOR||LA265_1==SQL92_RESERVED_TRUE||LA265_1==UNSIGNED_INTEGER) && ((input.LT(1).getText().equalsIgnoreCase("passing")))) {
                            alt265=1;
                        }
                        else if ( (LA265_1==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("returning"))||(input.LT(1).getText().equalsIgnoreCase("passing"))))) {
                            int LA265_3 = input.LA(3);

                            if ( (LA265_3==APPROXIMATE_NUM_LIT||LA265_3==ASTERISK||(LA265_3 >= CHAR_STRING && LA265_3 <= COMMA)||(LA265_3 >= CONCATENATION_OP && LA265_3 <= DELIMITED_ID)||(LA265_3 >= EQUALS_OP && LA265_3 <= EXACT_NUM_LIT)||(LA265_3 >= GREATER_THAN_OP && LA265_3 <= GREATER_THAN_OR_EQUALS_OP)||(LA265_3 >= INTRODUCER && LA265_3 <= MINUS_SIGN)||LA265_3==NOT_EQUAL_OP||LA265_3==PERIOD||LA265_3==PLUS_SIGN||LA265_3==REGULAR_ID||LA265_3==SOLIDUS||LA265_3==SQL92_RESERVED_ALL||(LA265_3 >= SQL92_RESERVED_AND && LA265_3 <= SQL92_RESERVED_AS)||LA265_3==SQL92_RESERVED_BETWEEN||LA265_3==SQL92_RESERVED_CASE||LA265_3==SQL92_RESERVED_DEFAULT||LA265_3==SQL92_RESERVED_DISTINCT||(LA265_3 >= SQL92_RESERVED_EXISTS && LA265_3 <= SQL92_RESERVED_FALSE)||LA265_3==SQL92_RESERVED_IN||(LA265_3 >= SQL92_RESERVED_IS && LA265_3 <= SQL92_RESERVED_NOT)||LA265_3==SQL92_RESERVED_OR||LA265_3==SQL92_RESERVED_PRIOR||LA265_3==SQL92_RESERVED_TRUE||LA265_3==UNSIGNED_INTEGER) && ((input.LT(1).getText().equalsIgnoreCase("passing")))) {
                                alt265=1;
                            }
                            else if ( (LA265_3==SQL92_RESERVED_NULL) && (((input.LT(1).getText().equalsIgnoreCase("returning"))||(input.LT(1).getText().equalsIgnoreCase("passing"))))) {
                                int LA265_4 = input.LA(4);

                                if ( (LA265_4==ASTERISK||LA265_4==CHAR_STRING||LA265_4==COMMA||(LA265_4 >= CONCATENATION_OP && LA265_4 <= DELIMITED_ID)||LA265_4==EQUALS_OP||(LA265_4 >= GREATER_THAN_OP && LA265_4 <= GREATER_THAN_OR_EQUALS_OP)||(LA265_4 >= INTRODUCER && LA265_4 <= LEFT_BRACKET)||(LA265_4 >= LESS_THAN_OP && LA265_4 <= MINUS_SIGN)||LA265_4==NOT_EQUAL_OP||LA265_4==PLUS_SIGN||LA265_4==REGULAR_ID||LA265_4==SOLIDUS||LA265_4==SQL92_RESERVED_AND||LA265_4==SQL92_RESERVED_AS||LA265_4==SQL92_RESERVED_BETWEEN||LA265_4==SQL92_RESERVED_IN||(LA265_4 >= SQL92_RESERVED_IS && LA265_4 <= SQL92_RESERVED_NOT)||LA265_4==SQL92_RESERVED_OR) && ((input.LT(1).getText().equalsIgnoreCase("passing")))) {
                                    alt265=1;
                                }
                            }
                        }
                    }
                    switch (alt265) {
                        case 1 :
                            // PLSQL_DMLParser.g:1117:39: xml_passing_clause
                            {
                            pushFollow(FOLLOW_xml_passing_clause_in_standard_function11475);
                            xml_passing_clause855=xml_passing_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, xml_passing_clause855.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_returning_key_in_standard_function11494);
                    returning_key856=gPLSQLParser.returning_key();

                    state._fsp--;
                    if (state.failed) return retval;

                    pushFollow(FOLLOW_content_key_in_standard_function11497);
                    content_key857=gPLSQLParser.content_key();

                    state._fsp--;
                    if (state.failed) return retval;

                    // PLSQL_DMLParser.g:1118:45: ( null_key on_key ! empty_key !)?
                    int alt266=2;
                    int LA266_0 = input.LA(1);

                    if ( (LA266_0==SQL92_RESERVED_NULL) ) {
                        alt266=1;
                    }
                    switch (alt266) {
                        case 1 :
                            // PLSQL_DMLParser.g:1118:46: null_key on_key ! empty_key !
                            {
                            pushFollow(FOLLOW_null_key_in_standard_function11501);
                            null_key858=gPLSQLParser.null_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, null_key858.getTree());

                            pushFollow(FOLLOW_on_key_in_standard_function11503);
                            on_key859=gPLSQLParser.on_key();

                            state._fsp--;
                            if (state.failed) return retval;

                            pushFollow(FOLLOW_empty_key_in_standard_function11506);
                            empty_key860=gPLSQLParser.empty_key();

                            state._fsp--;
                            if (state.failed) return retval;

                            }
                            break;

                    }


                    RIGHT_PAREN861=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function11523); if (state.failed) return retval;

                    }
                    break;
                case 22 :
                    // PLSQL_DMLParser.g:1120:10: xmlroot_key ^ LEFT_PAREN ! concatenation_wrapper xmlroot_param_version_part ( COMMA ! xmlroot_param_standalone_part )? RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_xmlroot_key_in_standard_function11535);
                    xmlroot_key862=gPLSQLParser.xmlroot_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmlroot_key862.getTree(), root_0);

                    LEFT_PAREN863=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function11550); if (state.failed) return retval;

                    pushFollow(FOLLOW_concatenation_wrapper_in_standard_function11569);
                    concatenation_wrapper864=concatenation_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper864.getTree());

                    pushFollow(FOLLOW_xmlroot_param_version_part_in_standard_function11591);
                    xmlroot_param_version_part865=xmlroot_param_version_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, xmlroot_param_version_part865.getTree());

                    // PLSQL_DMLParser.g:1124:21: ( COMMA ! xmlroot_param_standalone_part )?
                    int alt267=2;
                    int LA267_0 = input.LA(1);

                    if ( (LA267_0==COMMA) ) {
                        alt267=1;
                    }
                    switch (alt267) {
                        case 1 :
                            // PLSQL_DMLParser.g:1124:22: COMMA ! xmlroot_param_standalone_part
                            {
                            COMMA866=(Token)match(input,COMMA,FOLLOW_COMMA_in_standard_function11614); if (state.failed) return retval;

                            pushFollow(FOLLOW_xmlroot_param_standalone_part_in_standard_function11617);
                            xmlroot_param_standalone_part867=xmlroot_param_standalone_part();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, xmlroot_param_standalone_part867.getTree());

                            }
                            break;

                    }


                    RIGHT_PAREN868=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function11633); if (state.failed) return retval;

                    }
                    break;
                case 23 :
                    // PLSQL_DMLParser.g:1126:10: xmlserialize_key ^ LEFT_PAREN ! ( document_key | content_key ) concatenation_wrapper ( as_key ! type_spec )? ( xmlserialize_param_enconding_part )? ( xmlserialize_param_version_part )? ( xmlserialize_param_ident_part )? ( ( hide_key | show_key ) defaults_key )? RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_xmlserialize_key_in_standard_function11645);
                    xmlserialize_key869=gPLSQLParser.xmlserialize_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmlserialize_key869.getTree(), root_0);

                    LEFT_PAREN870=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function11660); if (state.failed) return retval;

                    // PLSQL_DMLParser.g:1128:17: ( document_key | content_key )
                    int alt268=2;
                    int LA268_0 = input.LA(1);

                    if ( (LA268_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("document"))||(input.LT(1).getText().equalsIgnoreCase("content"))))) {
                        int LA268_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("document"))) ) {
                            alt268=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("content"))) ) {
                            alt268=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 268, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 268, 0, input);

                        throw nvae;

                    }
                    switch (alt268) {
                        case 1 :
                            // PLSQL_DMLParser.g:1128:18: document_key
                            {
                            pushFollow(FOLLOW_document_key_in_standard_function11680);
                            document_key871=gPLSQLParser.document_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, document_key871.getTree());

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1128:31: content_key
                            {
                            pushFollow(FOLLOW_content_key_in_standard_function11682);
                            content_key872=gPLSQLParser.content_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, content_key872.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_concatenation_wrapper_in_standard_function11701);
                    concatenation_wrapper873=concatenation_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper873.getTree());

                    // PLSQL_DMLParser.g:1129:39: ( as_key ! type_spec )?
                    int alt269=2;
                    int LA269_0 = input.LA(1);

                    if ( (LA269_0==SQL92_RESERVED_AS) ) {
                        alt269=1;
                    }
                    switch (alt269) {
                        case 1 :
                            // PLSQL_DMLParser.g:1129:40: as_key ! type_spec
                            {
                            pushFollow(FOLLOW_as_key_in_standard_function11704);
                            as_key874=gPLSQLParser.as_key();

                            state._fsp--;
                            if (state.failed) return retval;

                            pushFollow(FOLLOW_type_spec_in_standard_function11707);
                            type_spec875=gPLSQLParser.type_spec();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, type_spec875.getTree());

                            }
                            break;

                    }


                    // PLSQL_DMLParser.g:1130:17: ( xmlserialize_param_enconding_part )?
                    int alt270=2;
                    int LA270_0 = input.LA(1);

                    if ( (LA270_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("no"))||(input.LT(1).getText().equalsIgnoreCase("encoding"))||(input.LT(1).getText().equalsIgnoreCase("indent"))||(input.LT(1).getText().equalsIgnoreCase("version"))||(input.LT(1).getText().equalsIgnoreCase("hide"))||(input.LT(1).getText().equalsIgnoreCase("show"))))) {
                        int LA270_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("encoding"))) ) {
                            alt270=1;
                        }
                    }
                    switch (alt270) {
                        case 1 :
                            // PLSQL_DMLParser.g:1130:17: xmlserialize_param_enconding_part
                            {
                            pushFollow(FOLLOW_xmlserialize_param_enconding_part_in_standard_function11727);
                            xmlserialize_param_enconding_part876=xmlserialize_param_enconding_part();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, xmlserialize_param_enconding_part876.getTree());

                            }
                            break;

                    }


                    // PLSQL_DMLParser.g:1131:17: ( xmlserialize_param_version_part )?
                    int alt271=2;
                    int LA271_0 = input.LA(1);

                    if ( (LA271_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("no"))||(input.LT(1).getText().equalsIgnoreCase("indent"))||(input.LT(1).getText().equalsIgnoreCase("version"))||(input.LT(1).getText().equalsIgnoreCase("hide"))||(input.LT(1).getText().equalsIgnoreCase("show"))))) {
                        int LA271_1 = input.LA(2);

                        if ( (LA271_1==APPROXIMATE_NUM_LIT||(LA271_1 >= CHAR_STRING && LA271_1 <= COLON)||LA271_1==DELIMITED_ID||LA271_1==EXACT_NUM_LIT||LA271_1==INTRODUCER||LA271_1==LEFT_PAREN||LA271_1==MINUS_SIGN||LA271_1==PLUS_SIGN||LA271_1==SQL92_RESERVED_ALL||LA271_1==SQL92_RESERVED_ANY||LA271_1==SQL92_RESERVED_CASE||LA271_1==SQL92_RESERVED_DEFAULT||LA271_1==SQL92_RESERVED_DISTINCT||(LA271_1 >= SQL92_RESERVED_EXISTS && LA271_1 <= SQL92_RESERVED_FALSE)||LA271_1==SQL92_RESERVED_NULL||LA271_1==SQL92_RESERVED_PRIOR||LA271_1==SQL92_RESERVED_TRUE||LA271_1==UNSIGNED_INTEGER) && ((input.LT(1).getText().equalsIgnoreCase("version")))) {
                            alt271=1;
                        }
                        else if ( (LA271_1==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("no"))||(input.LT(1).getText().equalsIgnoreCase("indent"))||(input.LT(1).getText().equalsIgnoreCase("version"))||(input.LT(1).getText().equalsIgnoreCase("hide"))||(input.LT(1).getText().equalsIgnoreCase("show"))))) {
                            int LA271_4 = input.LA(3);

                            if ( ((input.LT(1).getText().equalsIgnoreCase("version"))) ) {
                                alt271=1;
                            }
                        }
                    }
                    switch (alt271) {
                        case 1 :
                            // PLSQL_DMLParser.g:1131:17: xmlserialize_param_version_part
                            {
                            pushFollow(FOLLOW_xmlserialize_param_version_part_in_standard_function11746);
                            xmlserialize_param_version_part877=xmlserialize_param_version_part();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, xmlserialize_param_version_part877.getTree());

                            }
                            break;

                    }


                    // PLSQL_DMLParser.g:1132:17: ( xmlserialize_param_ident_part )?
                    int alt272=2;
                    int LA272_0 = input.LA(1);

                    if ( (LA272_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("no"))||(input.LT(1).getText().equalsIgnoreCase("indent"))||(input.LT(1).getText().equalsIgnoreCase("hide"))||(input.LT(1).getText().equalsIgnoreCase("show"))))) {
                        int LA272_1 = input.LA(2);

                        if ( (LA272_1==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("no"))||(input.LT(1).getText().equalsIgnoreCase("indent"))||(input.LT(1).getText().equalsIgnoreCase("hide"))||(input.LT(1).getText().equalsIgnoreCase("show"))))) {
                            int LA272_3 = input.LA(3);

                            if ( (((input.LT(1).getText().equalsIgnoreCase("no"))||(input.LT(1).getText().equalsIgnoreCase("indent")))) ) {
                                alt272=1;
                            }
                        }
                        else if ( (LA272_1==RIGHT_PAREN||LA272_1==SQL92_RESERVED_SIZE) && ((input.LT(1).getText().equalsIgnoreCase("indent")))) {
                            alt272=1;
                        }
                    }
                    switch (alt272) {
                        case 1 :
                            // PLSQL_DMLParser.g:1132:17: xmlserialize_param_ident_part
                            {
                            pushFollow(FOLLOW_xmlserialize_param_ident_part_in_standard_function11765);
                            xmlserialize_param_ident_part878=xmlserialize_param_ident_part();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, xmlserialize_param_ident_part878.getTree());

                            }
                            break;

                    }


                    // PLSQL_DMLParser.g:1133:17: ( ( hide_key | show_key ) defaults_key )?
                    int alt274=2;
                    int LA274_0 = input.LA(1);

                    if ( (LA274_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("hide"))||(input.LT(1).getText().equalsIgnoreCase("show"))))) {
                        alt274=1;
                    }
                    switch (alt274) {
                        case 1 :
                            // PLSQL_DMLParser.g:1133:18: ( hide_key | show_key ) defaults_key
                            {
                            // PLSQL_DMLParser.g:1133:18: ( hide_key | show_key )
                            int alt273=2;
                            int LA273_0 = input.LA(1);

                            if ( (LA273_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("hide"))||(input.LT(1).getText().equalsIgnoreCase("show"))))) {
                                int LA273_1 = input.LA(2);

                                if ( ((input.LT(1).getText().equalsIgnoreCase("hide"))) ) {
                                    alt273=1;
                                }
                                else if ( ((input.LT(1).getText().equalsIgnoreCase("show"))) ) {
                                    alt273=2;
                                }
                                else {
                                    if (state.backtracking>0) {state.failed=true; return retval;}
                                    NoViableAltException nvae =
                                        new NoViableAltException("", 273, 1, input);

                                    throw nvae;

                                }
                            }
                            else {
                                if (state.backtracking>0) {state.failed=true; return retval;}
                                NoViableAltException nvae =
                                    new NoViableAltException("", 273, 0, input);

                                throw nvae;

                            }
                            switch (alt273) {
                                case 1 :
                                    // PLSQL_DMLParser.g:1133:19: hide_key
                                    {
                                    pushFollow(FOLLOW_hide_key_in_standard_function11786);
                                    hide_key879=gPLSQLParser.hide_key();

                                    state._fsp--;
                                    if (state.failed) return retval;
                                    if ( state.backtracking==0 ) adaptor.addChild(root_0, hide_key879.getTree());

                                    }
                                    break;
                                case 2 :
                                    // PLSQL_DMLParser.g:1133:28: show_key
                                    {
                                    pushFollow(FOLLOW_show_key_in_standard_function11788);
                                    show_key880=gPLSQLParser.show_key();

                                    state._fsp--;
                                    if (state.failed) return retval;
                                    if ( state.backtracking==0 ) adaptor.addChild(root_0, show_key880.getTree());

                                    }
                                    break;

                            }


                            pushFollow(FOLLOW_defaults_key_in_standard_function11791);
                            defaults_key881=gPLSQLParser.defaults_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, defaults_key881.getTree());

                            }
                            break;

                    }


                    RIGHT_PAREN882=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function11807); if (state.failed) return retval;

                    }
                    break;
                case 24 :
                    // PLSQL_DMLParser.g:1135:10: xmltable_key ^ LEFT_PAREN ! ( xml_namespaces_clause )? concatenation_wrapper ( xml_passing_clause )? ( columns_key ! xml_table_column ( COMMA ! xml_table_column ) )? RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_xmltable_key_in_standard_function11819);
                    xmltable_key883=gPLSQLParser.xmltable_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmltable_key883.getTree(), root_0);

                    LEFT_PAREN884=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_standard_function11834); if (state.failed) return retval;

                    // PLSQL_DMLParser.g:1137:17: ( xml_namespaces_clause )?
                    int alt275=2;
                    int LA275_0 = input.LA(1);

                    if ( (LA275_0==REGULAR_ID) ) {
                        int LA275_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("xmlnamespaces"))) ) {
                            alt275=1;
                        }
                    }
                    switch (alt275) {
                        case 1 :
                            // PLSQL_DMLParser.g:1137:17: xml_namespaces_clause
                            {
                            pushFollow(FOLLOW_xml_namespaces_clause_in_standard_function11853);
                            xml_namespaces_clause885=xml_namespaces_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, xml_namespaces_clause885.getTree());

                            }
                            break;

                    }


                    pushFollow(FOLLOW_concatenation_wrapper_in_standard_function11872);
                    concatenation_wrapper886=concatenation_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper886.getTree());

                    // PLSQL_DMLParser.g:1139:17: ( xml_passing_clause )?
                    int alt276=2;
                    int LA276_0 = input.LA(1);

                    if ( (LA276_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("passing")))) {
                        alt276=1;
                    }
                    switch (alt276) {
                        case 1 :
                            // PLSQL_DMLParser.g:1139:17: xml_passing_clause
                            {
                            pushFollow(FOLLOW_xml_passing_clause_in_standard_function11890);
                            xml_passing_clause887=xml_passing_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, xml_passing_clause887.getTree());

                            }
                            break;

                    }


                    // PLSQL_DMLParser.g:1140:17: ( columns_key ! xml_table_column ( COMMA ! xml_table_column ) )?
                    int alt277=2;
                    int LA277_0 = input.LA(1);

                    if ( (LA277_0==PLSQL_RESERVED_COLUMNS) ) {
                        alt277=1;
                    }
                    switch (alt277) {
                        case 1 :
                            // PLSQL_DMLParser.g:1140:18: columns_key ! xml_table_column ( COMMA ! xml_table_column )
                            {
                            pushFollow(FOLLOW_columns_key_in_standard_function11910);
                            columns_key888=gPLSQLParser.columns_key();

                            state._fsp--;
                            if (state.failed) return retval;

                            pushFollow(FOLLOW_xml_table_column_in_standard_function11913);
                            xml_table_column889=xml_table_column();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, xml_table_column889.getTree());

                            // PLSQL_DMLParser.g:1140:48: ( COMMA ! xml_table_column )
                            // PLSQL_DMLParser.g:1140:49: COMMA ! xml_table_column
                            {
                            COMMA890=(Token)match(input,COMMA,FOLLOW_COMMA_in_standard_function11916); if (state.failed) return retval;

                            pushFollow(FOLLOW_xml_table_column_in_standard_function11919);
                            xml_table_column891=xml_table_column();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, xml_table_column891.getTree());

                            }


                            }
                            break;

                    }


                    RIGHT_PAREN892=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_standard_function11936); if (state.failed) return retval;

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "standard_function"


    public static class stantard_function_enabling_over_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "stantard_function_enabling_over"
    // PLSQL_DMLParser.g:1144:1: stantard_function_enabling_over :{...}? => REGULAR_ID -> FUNCTION_ENABLING_OVER[$REGULAR_ID] ;
    public final PLSQLParser_PLSQL_DMLParser.stantard_function_enabling_over_return stantard_function_enabling_over() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.stantard_function_enabling_over_return retval = new PLSQLParser_PLSQL_DMLParser.stantard_function_enabling_over_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token REGULAR_ID893=null;

        Object REGULAR_ID893_tree=null;
        RewriteRuleTokenStream stream_REGULAR_ID=new RewriteRuleTokenStream(adaptor,"token REGULAR_ID");

        try {
            // PLSQL_DMLParser.g:1145:5: ({...}? => REGULAR_ID -> FUNCTION_ENABLING_OVER[$REGULAR_ID] )
            // PLSQL_DMLParser.g:1145:10: {...}? => REGULAR_ID
            {
            if ( !((enablesOverClause(input.LT(1).getText()))) ) {
                if (state.backtracking>0) {state.failed=true; return retval;}
                throw new FailedPredicateException(input, "stantard_function_enabling_over", "enablesOverClause(input.LT(1).getText())");
            }

            REGULAR_ID893=(Token)match(input,REGULAR_ID,FOLLOW_REGULAR_ID_in_stantard_function_enabling_over11960); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_REGULAR_ID.add(REGULAR_ID893);


            // AST REWRITE
            // elements: 
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 1145:67: -> FUNCTION_ENABLING_OVER[$REGULAR_ID]
            {
                adaptor.addChild(root_0, 
                (Object)adaptor.create(FUNCTION_ENABLING_OVER, REGULAR_ID893)
                );

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "stantard_function_enabling_over"


    public static class stantard_function_enabling_using_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "stantard_function_enabling_using"
    // PLSQL_DMLParser.g:1148:1: stantard_function_enabling_using :{...}? => REGULAR_ID -> FUNCTION_ENABLING_USING[$REGULAR_ID] ;
    public final PLSQLParser_PLSQL_DMLParser.stantard_function_enabling_using_return stantard_function_enabling_using() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.stantard_function_enabling_using_return retval = new PLSQLParser_PLSQL_DMLParser.stantard_function_enabling_using_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token REGULAR_ID894=null;

        Object REGULAR_ID894_tree=null;
        RewriteRuleTokenStream stream_REGULAR_ID=new RewriteRuleTokenStream(adaptor,"token REGULAR_ID");

        try {
            // PLSQL_DMLParser.g:1149:5: ({...}? => REGULAR_ID -> FUNCTION_ENABLING_USING[$REGULAR_ID] )
            // PLSQL_DMLParser.g:1149:10: {...}? => REGULAR_ID
            {
            if ( !((enablesUsingClause(input.LT(1).getText()))) ) {
                if (state.backtracking>0) {state.failed=true; return retval;}
                throw new FailedPredicateException(input, "stantard_function_enabling_using", "enablesUsingClause(input.LT(1).getText())");
            }

            REGULAR_ID894=(Token)match(input,REGULAR_ID,FOLLOW_REGULAR_ID_in_stantard_function_enabling_using11988); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_REGULAR_ID.add(REGULAR_ID894);


            // AST REWRITE
            // elements: 
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 1149:68: -> FUNCTION_ENABLING_USING[$REGULAR_ID]
            {
                adaptor.addChild(root_0, 
                (Object)adaptor.create(FUNCTION_ENABLING_USING, REGULAR_ID894)
                );

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "stantard_function_enabling_using"


    public static class stantard_function_enabling_within_or_over_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "stantard_function_enabling_within_or_over"
    // PLSQL_DMLParser.g:1152:1: stantard_function_enabling_within_or_over :{...}? => REGULAR_ID -> FUNCTION_ENABLING_WITHIN_OR_OVER[$REGULAR_ID] ;
    public final PLSQLParser_PLSQL_DMLParser.stantard_function_enabling_within_or_over_return stantard_function_enabling_within_or_over() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.stantard_function_enabling_within_or_over_return retval = new PLSQLParser_PLSQL_DMLParser.stantard_function_enabling_within_or_over_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token REGULAR_ID895=null;

        Object REGULAR_ID895_tree=null;
        RewriteRuleTokenStream stream_REGULAR_ID=new RewriteRuleTokenStream(adaptor,"token REGULAR_ID");

        try {
            // PLSQL_DMLParser.g:1153:5: ({...}? => REGULAR_ID -> FUNCTION_ENABLING_WITHIN_OR_OVER[$REGULAR_ID] )
            // PLSQL_DMLParser.g:1153:10: {...}? => REGULAR_ID
            {
            if ( !((enablesWithinOrOverClause(input.LT(1).getText()))) ) {
                if (state.backtracking>0) {state.failed=true; return retval;}
                throw new FailedPredicateException(input, "stantard_function_enabling_within_or_over", "enablesWithinOrOverClause(input.LT(1).getText())");
            }

            REGULAR_ID895=(Token)match(input,REGULAR_ID,FOLLOW_REGULAR_ID_in_stantard_function_enabling_within_or_over12016); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_REGULAR_ID.add(REGULAR_ID895);


            // AST REWRITE
            // elements: 
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 1153:75: -> FUNCTION_ENABLING_WITHIN_OR_OVER[$REGULAR_ID]
            {
                adaptor.addChild(root_0, 
                (Object)adaptor.create(FUNCTION_ENABLING_WITHIN_OR_OVER, REGULAR_ID895)
                );

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "stantard_function_enabling_within_or_over"


    public static class stantard_function_pedictions_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "stantard_function_pedictions"
    // PLSQL_DMLParser.g:1156:1: stantard_function_pedictions :{...}? => REGULAR_ID -> PREDICTION_FUNCTION[$REGULAR_ID] ;
    public final PLSQLParser_PLSQL_DMLParser.stantard_function_pedictions_return stantard_function_pedictions() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.stantard_function_pedictions_return retval = new PLSQLParser_PLSQL_DMLParser.stantard_function_pedictions_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token REGULAR_ID896=null;

        Object REGULAR_ID896_tree=null;
        RewriteRuleTokenStream stream_REGULAR_ID=new RewriteRuleTokenStream(adaptor,"token REGULAR_ID");

        try {
            // PLSQL_DMLParser.g:1157:5: ({...}? => REGULAR_ID -> PREDICTION_FUNCTION[$REGULAR_ID] )
            // PLSQL_DMLParser.g:1157:10: {...}? => REGULAR_ID
            {
            if ( !((isStandardPredictionFunction(input.LT(1).getText()))) ) {
                if (state.backtracking>0) {state.failed=true; return retval;}
                throw new FailedPredicateException(input, "stantard_function_pedictions", "isStandardPredictionFunction(input.LT(1).getText())");
            }

            REGULAR_ID896=(Token)match(input,REGULAR_ID,FOLLOW_REGULAR_ID_in_stantard_function_pedictions12044); if (state.failed) return retval; 
            if ( state.backtracking==0 ) stream_REGULAR_ID.add(REGULAR_ID896);


            // AST REWRITE
            // elements: 
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 1157:78: -> PREDICTION_FUNCTION[$REGULAR_ID]
            {
                adaptor.addChild(root_0, 
                (Object)adaptor.create(PREDICTION_FUNCTION, REGULAR_ID896)
                );

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "stantard_function_pedictions"


    public static class over_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "over_clause"
    // PLSQL_DMLParser.g:1160:1: over_clause : over_key ^ LEFT_PAREN ! ( query_partition_clause )? ( order_by_clause ( windowing_clause )? )? RIGHT_PAREN !;
    public final PLSQLParser_PLSQL_DMLParser.over_clause_return over_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.over_clause_return retval = new PLSQLParser_PLSQL_DMLParser.over_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN898=null;
        Token RIGHT_PAREN902=null;
        PLSQLParser_PLSQLKeys.over_key_return over_key897 =null;

        PLSQLParser_PLSQL_DMLParser.query_partition_clause_return query_partition_clause899 =null;

        PLSQLParser_PLSQL_DMLParser.order_by_clause_return order_by_clause900 =null;

        PLSQLParser_PLSQL_DMLParser.windowing_clause_return windowing_clause901 =null;


        Object LEFT_PAREN898_tree=null;
        Object RIGHT_PAREN902_tree=null;

        try {
            // PLSQL_DMLParser.g:1161:5: ( over_key ^ LEFT_PAREN ! ( query_partition_clause )? ( order_by_clause ( windowing_clause )? )? RIGHT_PAREN !)
            // PLSQL_DMLParser.g:1161:10: over_key ^ LEFT_PAREN ! ( query_partition_clause )? ( order_by_clause ( windowing_clause )? )? RIGHT_PAREN !
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_over_key_in_over_clause12069);
            over_key897=gPLSQLParser.over_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(over_key897.getTree(), root_0);

            LEFT_PAREN898=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_over_clause12080); if (state.failed) return retval;

            // PLSQL_DMLParser.g:1163:13: ( query_partition_clause )?
            int alt279=2;
            int LA279_0 = input.LA(1);

            if ( (LA279_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("partition")))) {
                alt279=1;
            }
            switch (alt279) {
                case 1 :
                    // PLSQL_DMLParser.g:1163:13: query_partition_clause
                    {
                    pushFollow(FOLLOW_query_partition_clause_in_over_clause12095);
                    query_partition_clause899=query_partition_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, query_partition_clause899.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:1164:13: ( order_by_clause ( windowing_clause )? )?
            int alt281=2;
            int LA281_0 = input.LA(1);

            if ( (LA281_0==SQL92_RESERVED_ORDER) ) {
                alt281=1;
            }
            switch (alt281) {
                case 1 :
                    // PLSQL_DMLParser.g:1164:14: order_by_clause ( windowing_clause )?
                    {
                    pushFollow(FOLLOW_order_by_clause_in_over_clause12111);
                    order_by_clause900=order_by_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, order_by_clause900.getTree());

                    // PLSQL_DMLParser.g:1164:30: ( windowing_clause )?
                    int alt280=2;
                    int LA280_0 = input.LA(1);

                    if ( (LA280_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("rows"))||(input.LT(1).getText().equalsIgnoreCase("range"))))) {
                        alt280=1;
                    }
                    switch (alt280) {
                        case 1 :
                            // PLSQL_DMLParser.g:1164:30: windowing_clause
                            {
                            pushFollow(FOLLOW_windowing_clause_in_over_clause12113);
                            windowing_clause901=windowing_clause();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, windowing_clause901.getTree());

                            }
                            break;

                    }


                    }
                    break;

            }


            RIGHT_PAREN902=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_over_clause12126); if (state.failed) return retval;

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "over_clause"


    public static class windowing_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "windowing_clause"
    // PLSQL_DMLParser.g:1168:1: windowing_clause : windowing_type ( between_key windowing_elements and_key windowing_elements | windowing_elements ) -> {mode == 1}? ^( windowing_type ^( between_key ( windowing_elements )+ ) ) -> ^( windowing_type ( windowing_elements )+ ) ;
    public final PLSQLParser_PLSQL_DMLParser.windowing_clause_return windowing_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.windowing_clause_return retval = new PLSQLParser_PLSQL_DMLParser.windowing_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.windowing_type_return windowing_type903 =null;

        PLSQLParser_PLSQLKeys.between_key_return between_key904 =null;

        PLSQLParser_PLSQL_DMLParser.windowing_elements_return windowing_elements905 =null;

        PLSQLParser_PLSQLKeys.and_key_return and_key906 =null;

        PLSQLParser_PLSQL_DMLParser.windowing_elements_return windowing_elements907 =null;

        PLSQLParser_PLSQL_DMLParser.windowing_elements_return windowing_elements908 =null;


        RewriteRuleSubtreeStream stream_windowing_type=new RewriteRuleSubtreeStream(adaptor,"rule windowing_type");
        RewriteRuleSubtreeStream stream_between_key=new RewriteRuleSubtreeStream(adaptor,"rule between_key");
        RewriteRuleSubtreeStream stream_and_key=new RewriteRuleSubtreeStream(adaptor,"rule and_key");
        RewriteRuleSubtreeStream stream_windowing_elements=new RewriteRuleSubtreeStream(adaptor,"rule windowing_elements");
            int mode = 0;    
        try {
            // PLSQL_DMLParser.g:1170:5: ( windowing_type ( between_key windowing_elements and_key windowing_elements | windowing_elements ) -> {mode == 1}? ^( windowing_type ^( between_key ( windowing_elements )+ ) ) -> ^( windowing_type ( windowing_elements )+ ) )
            // PLSQL_DMLParser.g:1170:10: windowing_type ( between_key windowing_elements and_key windowing_elements | windowing_elements )
            {
            pushFollow(FOLLOW_windowing_type_in_windowing_clause12155);
            windowing_type903=windowing_type();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_windowing_type.add(windowing_type903.getTree());

            // PLSQL_DMLParser.g:1171:5: ( between_key windowing_elements and_key windowing_elements | windowing_elements )
            int alt282=2;
            int LA282_0 = input.LA(1);

            if ( (LA282_0==SQL92_RESERVED_BETWEEN) ) {
                alt282=1;
            }
            else if ( (LA282_0==APPROXIMATE_NUM_LIT||(LA282_0 >= CHAR_STRING && LA282_0 <= COLON)||LA282_0==DELIMITED_ID||LA282_0==EXACT_NUM_LIT||LA282_0==INTRODUCER||LA282_0==LEFT_PAREN||LA282_0==MINUS_SIGN||LA282_0==PLUS_SIGN||LA282_0==REGULAR_ID||LA282_0==SQL92_RESERVED_ALL||LA282_0==SQL92_RESERVED_ANY||LA282_0==SQL92_RESERVED_CASE||LA282_0==SQL92_RESERVED_CURRENT||LA282_0==SQL92_RESERVED_DEFAULT||LA282_0==SQL92_RESERVED_DISTINCT||(LA282_0 >= SQL92_RESERVED_EXISTS && LA282_0 <= SQL92_RESERVED_FALSE)||LA282_0==SQL92_RESERVED_NULL||LA282_0==SQL92_RESERVED_PRIOR||LA282_0==SQL92_RESERVED_TRUE||LA282_0==UNSIGNED_INTEGER) ) {
                alt282=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 282, 0, input);

                throw nvae;

            }
            switch (alt282) {
                case 1 :
                    // PLSQL_DMLParser.g:1171:10: between_key windowing_elements and_key windowing_elements
                    {
                    pushFollow(FOLLOW_between_key_in_windowing_clause12166);
                    between_key904=gPLSQLParser.between_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_between_key.add(between_key904.getTree());

                    pushFollow(FOLLOW_windowing_elements_in_windowing_clause12168);
                    windowing_elements905=windowing_elements();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_windowing_elements.add(windowing_elements905.getTree());

                    pushFollow(FOLLOW_and_key_in_windowing_clause12170);
                    and_key906=gPLSQLParser.and_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_and_key.add(and_key906.getTree());

                    pushFollow(FOLLOW_windowing_elements_in_windowing_clause12172);
                    windowing_elements907=windowing_elements();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_windowing_elements.add(windowing_elements907.getTree());

                    if ( state.backtracking==0 ) {mode = 1;}

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1172:10: windowing_elements
                    {
                    pushFollow(FOLLOW_windowing_elements_in_windowing_clause12185);
                    windowing_elements908=windowing_elements();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_windowing_elements.add(windowing_elements908.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: windowing_elements, windowing_type, windowing_elements, between_key, windowing_type
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 1173:5: -> {mode == 1}? ^( windowing_type ^( between_key ( windowing_elements )+ ) )
            if (mode == 1) {
                // PLSQL_DMLParser.g:1173:20: ^( windowing_type ^( between_key ( windowing_elements )+ ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_windowing_type.nextNode(), root_1);

                // PLSQL_DMLParser.g:1173:37: ^( between_key ( windowing_elements )+ )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(stream_between_key.nextNode(), root_2);

                if ( !(stream_windowing_elements.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_windowing_elements.hasNext() ) {
                    adaptor.addChild(root_2, stream_windowing_elements.nextTree());

                }
                stream_windowing_elements.reset();

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }

            else // 1174:5: -> ^( windowing_type ( windowing_elements )+ )
            {
                // PLSQL_DMLParser.g:1174:8: ^( windowing_type ( windowing_elements )+ )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_windowing_type.nextNode(), root_1);

                if ( !(stream_windowing_elements.hasNext()) ) {
                    throw new RewriteEarlyExitException();
                }
                while ( stream_windowing_elements.hasNext() ) {
                    adaptor.addChild(root_1, stream_windowing_elements.nextTree());

                }
                stream_windowing_elements.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "windowing_clause"


    public static class windowing_type_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "windowing_type"
    // PLSQL_DMLParser.g:1177:1: windowing_type : ( rows_key | range_key );
    public final PLSQLParser_PLSQL_DMLParser.windowing_type_return windowing_type() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.windowing_type_return retval = new PLSQLParser_PLSQL_DMLParser.windowing_type_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.rows_key_return rows_key909 =null;

        PLSQLParser_PLSQLKeys.range_key_return range_key910 =null;



        try {
            // PLSQL_DMLParser.g:1178:5: ( rows_key | range_key )
            int alt283=2;
            int LA283_0 = input.LA(1);

            if ( (LA283_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("rows"))||(input.LT(1).getText().equalsIgnoreCase("range"))))) {
                int LA283_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("rows"))) ) {
                    alt283=1;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("range"))) ) {
                    alt283=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 283, 1, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 283, 0, input);

                throw nvae;

            }
            switch (alt283) {
                case 1 :
                    // PLSQL_DMLParser.g:1178:10: rows_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_rows_key_in_windowing_type12244);
                    rows_key909=gPLSQLParser.rows_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, rows_key909.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1179:10: range_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_range_key_in_windowing_type12255);
                    range_key910=gPLSQLParser.range_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, range_key910.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "windowing_type"


    public static class windowing_elements_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "windowing_elements"
    // PLSQL_DMLParser.g:1182:1: windowing_elements : ( unbounded_key ^ preceding_key | current_key ^ row_key | concatenation_wrapper ( preceding_key ^| following_key ^) );
    public final PLSQLParser_PLSQL_DMLParser.windowing_elements_return windowing_elements() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.windowing_elements_return retval = new PLSQLParser_PLSQL_DMLParser.windowing_elements_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.unbounded_key_return unbounded_key911 =null;

        PLSQLParser_PLSQLKeys.preceding_key_return preceding_key912 =null;

        PLSQLParser_PLSQLKeys.current_key_return current_key913 =null;

        PLSQLParser_PLSQLKeys.row_key_return row_key914 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper915 =null;

        PLSQLParser_PLSQLKeys.preceding_key_return preceding_key916 =null;

        PLSQLParser_PLSQLKeys.following_key_return following_key917 =null;



        try {
            // PLSQL_DMLParser.g:1183:5: ( unbounded_key ^ preceding_key | current_key ^ row_key | concatenation_wrapper ( preceding_key ^| following_key ^) )
            int alt285=3;
            switch ( input.LA(1) ) {
            case REGULAR_ID:
                {
                int LA285_1 = input.LA(2);

                if ( (LA285_1==REGULAR_ID) ) {
                    int LA285_4 = input.LA(3);

                    if ( ((input.LT(1).getText().equalsIgnoreCase("unbounded"))) ) {
                        alt285=1;
                    }
                    else if ( (true) ) {
                        alt285=3;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 285, 4, input);

                        throw nvae;

                    }
                }
                else if ( (LA285_1==MINUS_SIGN||LA285_1==PLUS_SIGN) ) {
                    alt285=3;
                }
                else if ( (LA285_1==DELIMITED_ID||LA285_1==SQL92_RESERVED_ALL||LA285_1==SQL92_RESERVED_DISTINCT||LA285_1==SQL92_RESERVED_PRIOR) && ((((input.LT(1).getText().equalsIgnoreCase("new") && !input.LT(2).getText().equals("."))&&(input.LT(1).getText().equalsIgnoreCase("new") && !input.LT(2).getText().equals(".")))&&(input.LT(1).getText().equalsIgnoreCase("new"))))) {
                    alt285=3;
                }
                else if ( (LA285_1==SQL92_RESERVED_CASE) ) {
                    alt285=3;
                }
                else if ( (LA285_1==APPROXIMATE_NUM_LIT||LA285_1==CHAR_STRING||LA285_1==EXACT_NUM_LIT||LA285_1==INTRODUCER||LA285_1==SQL92_RESERVED_ANY||LA285_1==SQL92_RESERVED_DEFAULT||(LA285_1 >= SQL92_RESERVED_EXISTS && LA285_1 <= SQL92_RESERVED_FALSE)||LA285_1==SQL92_RESERVED_NULL||LA285_1==SQL92_RESERVED_TRUE||LA285_1==UNSIGNED_INTEGER) && ((((input.LT(1).getText().equalsIgnoreCase("new") && !input.LT(2).getText().equals("."))&&(input.LT(1).getText().equalsIgnoreCase("new") && !input.LT(2).getText().equals(".")))&&(input.LT(1).getText().equalsIgnoreCase("new"))))) {
                    alt285=3;
                }
                else if ( (LA285_1==ASTERISK||LA285_1==COLON||LA285_1==CONCATENATION_OP||(LA285_1 >= LEFT_BRACKET && LA285_1 <= LEFT_PAREN)||LA285_1==PERIOD||LA285_1==SOLIDUS) ) {
                    alt285=3;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 285, 1, input);

                    throw nvae;

                }
                }
                break;
            case SQL92_RESERVED_CURRENT:
                {
                alt285=2;
                }
                break;
            case APPROXIMATE_NUM_LIT:
            case CHAR_STRING:
            case COLON:
            case DELIMITED_ID:
            case EXACT_NUM_LIT:
            case INTRODUCER:
            case LEFT_PAREN:
            case MINUS_SIGN:
            case PLUS_SIGN:
            case SQL92_RESERVED_ALL:
            case SQL92_RESERVED_ANY:
            case SQL92_RESERVED_CASE:
            case SQL92_RESERVED_DEFAULT:
            case SQL92_RESERVED_DISTINCT:
            case SQL92_RESERVED_EXISTS:
            case SQL92_RESERVED_FALSE:
            case SQL92_RESERVED_NULL:
            case SQL92_RESERVED_PRIOR:
            case SQL92_RESERVED_TRUE:
            case UNSIGNED_INTEGER:
                {
                alt285=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 285, 0, input);

                throw nvae;

            }

            switch (alt285) {
                case 1 :
                    // PLSQL_DMLParser.g:1183:10: unbounded_key ^ preceding_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_unbounded_key_in_windowing_elements12275);
                    unbounded_key911=gPLSQLParser.unbounded_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(unbounded_key911.getTree(), root_0);

                    pushFollow(FOLLOW_preceding_key_in_windowing_elements12278);
                    preceding_key912=gPLSQLParser.preceding_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, preceding_key912.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1184:10: current_key ^ row_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_current_key_in_windowing_elements12289);
                    current_key913=gPLSQLParser.current_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(current_key913.getTree(), root_0);

                    pushFollow(FOLLOW_row_key_in_windowing_elements12292);
                    row_key914=gPLSQLParser.row_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, row_key914.getTree());

                    }
                    break;
                case 3 :
                    // PLSQL_DMLParser.g:1185:10: concatenation_wrapper ( preceding_key ^| following_key ^)
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_concatenation_wrapper_in_windowing_elements12303);
                    concatenation_wrapper915=concatenation_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper915.getTree());

                    // PLSQL_DMLParser.g:1185:32: ( preceding_key ^| following_key ^)
                    int alt284=2;
                    int LA284_0 = input.LA(1);

                    if ( (LA284_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("preceding"))||(input.LT(1).getText().equalsIgnoreCase("following"))))) {
                        int LA284_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("preceding"))) ) {
                            alt284=1;
                        }
                        else if ( ((input.LT(1).getText().equalsIgnoreCase("following"))) ) {
                            alt284=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 284, 1, input);

                            throw nvae;

                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 284, 0, input);

                        throw nvae;

                    }
                    switch (alt284) {
                        case 1 :
                            // PLSQL_DMLParser.g:1185:33: preceding_key ^
                            {
                            pushFollow(FOLLOW_preceding_key_in_windowing_elements12306);
                            preceding_key916=gPLSQLParser.preceding_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(preceding_key916.getTree(), root_0);

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1185:48: following_key ^
                            {
                            pushFollow(FOLLOW_following_key_in_windowing_elements12309);
                            following_key917=gPLSQLParser.following_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(following_key917.getTree(), root_0);

                            }
                            break;

                    }


                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "windowing_elements"


    public static class using_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "using_clause"
    // PLSQL_DMLParser.g:1188:1: using_clause : using_key ^ ( ASTERISK | using_element ( COMMA ! using_element )* ) ;
    public final PLSQLParser_PLSQL_DMLParser.using_clause_return using_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.using_clause_return retval = new PLSQLParser_PLSQL_DMLParser.using_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token ASTERISK919=null;
        Token COMMA921=null;
        PLSQLParser_PLSQLKeys.using_key_return using_key918 =null;

        PLSQLParser_PLSQL_DMLParser.using_element_return using_element920 =null;

        PLSQLParser_PLSQL_DMLParser.using_element_return using_element922 =null;


        Object ASTERISK919_tree=null;
        Object COMMA921_tree=null;

        try {
            // PLSQL_DMLParser.g:1189:5: ( using_key ^ ( ASTERISK | using_element ( COMMA ! using_element )* ) )
            // PLSQL_DMLParser.g:1189:10: using_key ^ ( ASTERISK | using_element ( COMMA ! using_element )* )
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_using_key_in_using_clause12331);
            using_key918=gPLSQLParser.using_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(using_key918.getTree(), root_0);

            // PLSQL_DMLParser.g:1190:5: ( ASTERISK | using_element ( COMMA ! using_element )* )
            int alt287=2;
            int LA287_0 = input.LA(1);

            if ( (LA287_0==ASTERISK) ) {
                alt287=1;
            }
            else if ( (LA287_0==APPROXIMATE_NUM_LIT||(LA287_0 >= CHAR_STRING && LA287_0 <= COLON)||LA287_0==DELIMITED_ID||LA287_0==EXACT_NUM_LIT||LA287_0==INTRODUCER||LA287_0==LEFT_PAREN||LA287_0==MINUS_SIGN||LA287_0==PLUS_SIGN||LA287_0==REGULAR_ID||LA287_0==SQL92_RESERVED_ALL||LA287_0==SQL92_RESERVED_ANY||LA287_0==SQL92_RESERVED_CASE||LA287_0==SQL92_RESERVED_DEFAULT||LA287_0==SQL92_RESERVED_DISTINCT||(LA287_0 >= SQL92_RESERVED_EXISTS && LA287_0 <= SQL92_RESERVED_FALSE)||LA287_0==SQL92_RESERVED_IN||(LA287_0 >= SQL92_RESERVED_NOT && LA287_0 <= SQL92_RESERVED_NULL)||LA287_0==SQL92_RESERVED_PRIOR||LA287_0==SQL92_RESERVED_TRUE||LA287_0==UNSIGNED_INTEGER) ) {
                alt287=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 287, 0, input);

                throw nvae;

            }
            switch (alt287) {
                case 1 :
                    // PLSQL_DMLParser.g:1190:10: ASTERISK
                    {
                    ASTERISK919=(Token)match(input,ASTERISK,FOLLOW_ASTERISK_in_using_clause12343); if (state.failed) return retval;
                    if ( state.backtracking==0 ) {
                    ASTERISK919_tree = 
                    (Object)adaptor.create(ASTERISK919)
                    ;
                    adaptor.addChild(root_0, ASTERISK919_tree);
                    }

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1191:10: using_element ( COMMA ! using_element )*
                    {
                    pushFollow(FOLLOW_using_element_in_using_clause12354);
                    using_element920=using_element();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, using_element920.getTree());

                    // PLSQL_DMLParser.g:1191:24: ( COMMA ! using_element )*
                    loop286:
                    do {
                        int alt286=2;
                        int LA286_0 = input.LA(1);

                        if ( (LA286_0==COMMA) ) {
                            alt286=1;
                        }


                        switch (alt286) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:1191:25: COMMA ! using_element
                    	    {
                    	    COMMA921=(Token)match(input,COMMA,FOLLOW_COMMA_in_using_clause12357); if (state.failed) return retval;

                    	    pushFollow(FOLLOW_using_element_in_using_clause12360);
                    	    using_element922=using_element();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) adaptor.addChild(root_0, using_element922.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop286;
                        }
                    } while (true);


                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "using_clause"


    public static class using_element_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "using_element"
    // PLSQL_DMLParser.g:1195:1: using_element : ( in_key ( out_key )? | out_key )? select_list_elements ( alias )? -> ^( ELEMENT ( in_key )? ( out_key )? select_list_elements ( alias )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.using_element_return using_element() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.using_element_return retval = new PLSQLParser_PLSQL_DMLParser.using_element_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.in_key_return in_key923 =null;

        PLSQLParser_PLSQLKeys.out_key_return out_key924 =null;

        PLSQLParser_PLSQLKeys.out_key_return out_key925 =null;

        PLSQLParser_PLSQL_DMLParser.select_list_elements_return select_list_elements926 =null;

        PLSQLParser_PLSQLCommons.alias_return alias927 =null;


        RewriteRuleSubtreeStream stream_alias=new RewriteRuleSubtreeStream(adaptor,"rule alias");
        RewriteRuleSubtreeStream stream_out_key=new RewriteRuleSubtreeStream(adaptor,"rule out_key");
        RewriteRuleSubtreeStream stream_select_list_elements=new RewriteRuleSubtreeStream(adaptor,"rule select_list_elements");
        RewriteRuleSubtreeStream stream_in_key=new RewriteRuleSubtreeStream(adaptor,"rule in_key");
        try {
            // PLSQL_DMLParser.g:1196:5: ( ( in_key ( out_key )? | out_key )? select_list_elements ( alias )? -> ^( ELEMENT ( in_key )? ( out_key )? select_list_elements ( alias )? ) )
            // PLSQL_DMLParser.g:1196:10: ( in_key ( out_key )? | out_key )? select_list_elements ( alias )?
            {
            // PLSQL_DMLParser.g:1196:10: ( in_key ( out_key )? | out_key )?
            int alt289=3;
            int LA289_0 = input.LA(1);

            if ( (LA289_0==SQL92_RESERVED_IN) ) {
                alt289=1;
            }
            else if ( (LA289_0==REGULAR_ID) ) {
                int LA289_2 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("out"))) ) {
                    alt289=2;
                }
            }
            switch (alt289) {
                case 1 :
                    // PLSQL_DMLParser.g:1196:11: in_key ( out_key )?
                    {
                    pushFollow(FOLLOW_in_key_in_using_element12389);
                    in_key923=gPLSQLParser.in_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_in_key.add(in_key923.getTree());

                    // PLSQL_DMLParser.g:1196:18: ( out_key )?
                    int alt288=2;
                    int LA288_0 = input.LA(1);

                    if ( (LA288_0==REGULAR_ID) ) {
                        int LA288_1 = input.LA(2);

                        if ( ((input.LT(1).getText().equalsIgnoreCase("out"))) ) {
                            alt288=1;
                        }
                    }
                    switch (alt288) {
                        case 1 :
                            // PLSQL_DMLParser.g:1196:18: out_key
                            {
                            pushFollow(FOLLOW_out_key_in_using_element12391);
                            out_key924=gPLSQLParser.out_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_out_key.add(out_key924.getTree());

                            }
                            break;

                    }


                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1196:27: out_key
                    {
                    pushFollow(FOLLOW_out_key_in_using_element12394);
                    out_key925=gPLSQLParser.out_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_out_key.add(out_key925.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_select_list_elements_in_using_element12398);
            select_list_elements926=select_list_elements();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_select_list_elements.add(select_list_elements926.getTree());

            // PLSQL_DMLParser.g:1196:58: ( alias )?
            int alt290=2;
            switch ( input.LA(1) ) {
                case SQL92_RESERVED_AS:
                    {
                    alt290=1;
                    }
                    break;
                case INTRODUCER:
                    {
                    alt290=1;
                    }
                    break;
                case REGULAR_ID:
                    {
                    alt290=1;
                    }
                    break;
                case DELIMITED_ID:
                    {
                    alt290=1;
                    }
                    break;
                case CHAR_STRING:
                    {
                    alt290=1;
                    }
                    break;
            }

            switch (alt290) {
                case 1 :
                    // PLSQL_DMLParser.g:1196:58: alias
                    {
                    pushFollow(FOLLOW_alias_in_using_element12400);
                    alias927=gPLSQLParser.alias();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_alias.add(alias927.getTree());

                    }
                    break;

            }


            // AST REWRITE
            // elements: in_key, alias, select_list_elements, out_key
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 1197:9: -> ^( ELEMENT ( in_key )? ( out_key )? select_list_elements ( alias )? )
            {
                // PLSQL_DMLParser.g:1197:12: ^( ELEMENT ( in_key )? ( out_key )? select_list_elements ( alias )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(ELEMENT, "ELEMENT")
                , root_1);

                // PLSQL_DMLParser.g:1197:22: ( in_key )?
                if ( stream_in_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_in_key.nextTree());

                }
                stream_in_key.reset();

                // PLSQL_DMLParser.g:1197:30: ( out_key )?
                if ( stream_out_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_out_key.nextTree());

                }
                stream_out_key.reset();

                adaptor.addChild(root_1, stream_select_list_elements.nextTree());

                // PLSQL_DMLParser.g:1197:60: ( alias )?
                if ( stream_alias.hasNext() ) {
                    adaptor.addChild(root_1, stream_alias.nextTree());

                }
                stream_alias.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "using_element"


    public static class collect_order_by_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "collect_order_by_part"
    // PLSQL_DMLParser.g:1200:1: collect_order_by_part : order_key ^ by_key ! concatenation_wrapper ;
    public final PLSQLParser_PLSQL_DMLParser.collect_order_by_part_return collect_order_by_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.collect_order_by_part_return retval = new PLSQLParser_PLSQL_DMLParser.collect_order_by_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.order_key_return order_key928 =null;

        PLSQLParser_PLSQLKeys.by_key_return by_key929 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper930 =null;



        try {
            // PLSQL_DMLParser.g:1201:5: ( order_key ^ by_key ! concatenation_wrapper )
            // PLSQL_DMLParser.g:1201:10: order_key ^ by_key ! concatenation_wrapper
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_order_key_in_collect_order_by_part12446);
            order_key928=gPLSQLParser.order_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(order_key928.getTree(), root_0);

            pushFollow(FOLLOW_by_key_in_collect_order_by_part12449);
            by_key929=gPLSQLParser.by_key();

            state._fsp--;
            if (state.failed) return retval;

            pushFollow(FOLLOW_concatenation_wrapper_in_collect_order_by_part12452);
            concatenation_wrapper930=concatenation_wrapper();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper930.getTree());

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "collect_order_by_part"


    public static class within_or_over_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "within_or_over_part"
    // PLSQL_DMLParser.g:1204:1: within_or_over_part : ( within_key ^ group_key ! LEFT_PAREN ! order_by_clause RIGHT_PAREN !| over_clause );
    public final PLSQLParser_PLSQL_DMLParser.within_or_over_part_return within_or_over_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.within_or_over_part_return retval = new PLSQLParser_PLSQL_DMLParser.within_or_over_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN933=null;
        Token RIGHT_PAREN935=null;
        PLSQLParser_PLSQLKeys.within_key_return within_key931 =null;

        PLSQLParser_PLSQLKeys.group_key_return group_key932 =null;

        PLSQLParser_PLSQL_DMLParser.order_by_clause_return order_by_clause934 =null;

        PLSQLParser_PLSQL_DMLParser.over_clause_return over_clause936 =null;


        Object LEFT_PAREN933_tree=null;
        Object RIGHT_PAREN935_tree=null;

        try {
            // PLSQL_DMLParser.g:1205:5: ( within_key ^ group_key ! LEFT_PAREN ! order_by_clause RIGHT_PAREN !| over_clause )
            int alt291=2;
            int LA291_0 = input.LA(1);

            if ( (LA291_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("over"))||(input.LT(1).getText().equalsIgnoreCase("within"))))) {
                int LA291_1 = input.LA(2);

                if ( (LA291_1==SQL92_RESERVED_GROUP) && ((input.LT(1).getText().equalsIgnoreCase("within")))) {
                    alt291=1;
                }
                else if ( (LA291_1==LEFT_PAREN) && ((input.LT(1).getText().equalsIgnoreCase("over")))) {
                    alt291=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 291, 1, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 291, 0, input);

                throw nvae;

            }
            switch (alt291) {
                case 1 :
                    // PLSQL_DMLParser.g:1205:10: within_key ^ group_key ! LEFT_PAREN ! order_by_clause RIGHT_PAREN !
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_within_key_in_within_or_over_part12472);
                    within_key931=gPLSQLParser.within_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(within_key931.getTree(), root_0);

                    pushFollow(FOLLOW_group_key_in_within_or_over_part12475);
                    group_key932=gPLSQLParser.group_key();

                    state._fsp--;
                    if (state.failed) return retval;

                    LEFT_PAREN933=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_within_or_over_part12478); if (state.failed) return retval;

                    pushFollow(FOLLOW_order_by_clause_in_within_or_over_part12481);
                    order_by_clause934=order_by_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, order_by_clause934.getTree());

                    RIGHT_PAREN935=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_within_or_over_part12483); if (state.failed) return retval;

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1206:10: over_clause
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_over_clause_in_within_or_over_part12495);
                    over_clause936=over_clause();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, over_clause936.getTree());

                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "within_or_over_part"


    public static class cost_matrix_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "cost_matrix_clause"
    // PLSQL_DMLParser.g:1209:1: cost_matrix_clause : cost_key ^ ( model_key ( auto_key )? | LEFT_PAREN ! cost_class_name ( COMMA ! cost_class_name )* RIGHT_PAREN ! values_key ! expression_list ) ;
    public final PLSQLParser_PLSQL_DMLParser.cost_matrix_clause_return cost_matrix_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.cost_matrix_clause_return retval = new PLSQLParser_PLSQL_DMLParser.cost_matrix_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN940=null;
        Token COMMA942=null;
        Token RIGHT_PAREN944=null;
        PLSQLParser_PLSQLKeys.cost_key_return cost_key937 =null;

        PLSQLParser_PLSQLKeys.model_key_return model_key938 =null;

        PLSQLParser_PLSQLKeys.auto_key_return auto_key939 =null;

        PLSQLParser_PLSQLCommons.cost_class_name_return cost_class_name941 =null;

        PLSQLParser_PLSQLCommons.cost_class_name_return cost_class_name943 =null;

        PLSQLParser_PLSQLKeys.values_key_return values_key945 =null;

        PLSQLParser_PLSQL_DMLParser.expression_list_return expression_list946 =null;


        Object LEFT_PAREN940_tree=null;
        Object COMMA942_tree=null;
        Object RIGHT_PAREN944_tree=null;

        try {
            // PLSQL_DMLParser.g:1210:5: ( cost_key ^ ( model_key ( auto_key )? | LEFT_PAREN ! cost_class_name ( COMMA ! cost_class_name )* RIGHT_PAREN ! values_key ! expression_list ) )
            // PLSQL_DMLParser.g:1210:10: cost_key ^ ( model_key ( auto_key )? | LEFT_PAREN ! cost_class_name ( COMMA ! cost_class_name )* RIGHT_PAREN ! values_key ! expression_list )
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_cost_key_in_cost_matrix_clause12515);
            cost_key937=gPLSQLParser.cost_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(cost_key937.getTree(), root_0);

            // PLSQL_DMLParser.g:1211:5: ( model_key ( auto_key )? | LEFT_PAREN ! cost_class_name ( COMMA ! cost_class_name )* RIGHT_PAREN ! values_key ! expression_list )
            int alt294=2;
            int LA294_0 = input.LA(1);

            if ( (LA294_0==PLSQL_NON_RESERVED_MODEL) ) {
                alt294=1;
            }
            else if ( (LA294_0==LEFT_PAREN) ) {
                alt294=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 294, 0, input);

                throw nvae;

            }
            switch (alt294) {
                case 1 :
                    // PLSQL_DMLParser.g:1211:10: model_key ( auto_key )?
                    {
                    pushFollow(FOLLOW_model_key_in_cost_matrix_clause12527);
                    model_key938=gPLSQLParser.model_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, model_key938.getTree());

                    // PLSQL_DMLParser.g:1211:20: ( auto_key )?
                    int alt292=2;
                    int LA292_0 = input.LA(1);

                    if ( (LA292_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("auto")))) {
                        alt292=1;
                    }
                    switch (alt292) {
                        case 1 :
                            // PLSQL_DMLParser.g:1211:20: auto_key
                            {
                            pushFollow(FOLLOW_auto_key_in_cost_matrix_clause12529);
                            auto_key939=gPLSQLParser.auto_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, auto_key939.getTree());

                            }
                            break;

                    }


                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1212:10: LEFT_PAREN ! cost_class_name ( COMMA ! cost_class_name )* RIGHT_PAREN ! values_key ! expression_list
                    {
                    LEFT_PAREN940=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_cost_matrix_clause12541); if (state.failed) return retval;

                    pushFollow(FOLLOW_cost_class_name_in_cost_matrix_clause12544);
                    cost_class_name941=gPLSQLParser.cost_class_name();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, cost_class_name941.getTree());

                    // PLSQL_DMLParser.g:1212:38: ( COMMA ! cost_class_name )*
                    loop293:
                    do {
                        int alt293=2;
                        int LA293_0 = input.LA(1);

                        if ( (LA293_0==COMMA) ) {
                            alt293=1;
                        }


                        switch (alt293) {
                    	case 1 :
                    	    // PLSQL_DMLParser.g:1212:39: COMMA ! cost_class_name
                    	    {
                    	    COMMA942=(Token)match(input,COMMA,FOLLOW_COMMA_in_cost_matrix_clause12547); if (state.failed) return retval;

                    	    pushFollow(FOLLOW_cost_class_name_in_cost_matrix_clause12550);
                    	    cost_class_name943=gPLSQLParser.cost_class_name();

                    	    state._fsp--;
                    	    if (state.failed) return retval;
                    	    if ( state.backtracking==0 ) adaptor.addChild(root_0, cost_class_name943.getTree());

                    	    }
                    	    break;

                    	default :
                    	    break loop293;
                        }
                    } while (true);


                    RIGHT_PAREN944=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_cost_matrix_clause12554); if (state.failed) return retval;

                    pushFollow(FOLLOW_values_key_in_cost_matrix_clause12557);
                    values_key945=gPLSQLParser.values_key();

                    state._fsp--;
                    if (state.failed) return retval;

                    pushFollow(FOLLOW_expression_list_in_cost_matrix_clause12573);
                    expression_list946=expression_list();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_list946.getTree());

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "cost_matrix_clause"


    public static class xml_passing_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "xml_passing_clause"
    // PLSQL_DMLParser.g:1217:1: xml_passing_clause : passing_key ^ ( by_key ! value_key )? expression_wrapper ( alias )? ( COMMA ! expression_wrapper ( alias )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.xml_passing_clause_return xml_passing_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.xml_passing_clause_return retval = new PLSQLParser_PLSQL_DMLParser.xml_passing_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token COMMA952=null;
        PLSQLParser_PLSQLKeys.passing_key_return passing_key947 =null;

        PLSQLParser_PLSQLKeys.by_key_return by_key948 =null;

        PLSQLParser_PLSQLKeys.value_key_return value_key949 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper950 =null;

        PLSQLParser_PLSQLCommons.alias_return alias951 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper953 =null;

        PLSQLParser_PLSQLCommons.alias_return alias954 =null;


        Object COMMA952_tree=null;

        try {
            // PLSQL_DMLParser.g:1218:5: ( passing_key ^ ( by_key ! value_key )? expression_wrapper ( alias )? ( COMMA ! expression_wrapper ( alias )? ) )
            // PLSQL_DMLParser.g:1218:10: passing_key ^ ( by_key ! value_key )? expression_wrapper ( alias )? ( COMMA ! expression_wrapper ( alias )? )
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_passing_key_in_xml_passing_clause12599);
            passing_key947=gPLSQLParser.passing_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(passing_key947.getTree(), root_0);

            // PLSQL_DMLParser.g:1218:23: ( by_key ! value_key )?
            int alt295=2;
            int LA295_0 = input.LA(1);

            if ( (LA295_0==SQL92_RESERVED_BY) ) {
                alt295=1;
            }
            switch (alt295) {
                case 1 :
                    // PLSQL_DMLParser.g:1218:24: by_key ! value_key
                    {
                    pushFollow(FOLLOW_by_key_in_xml_passing_clause12603);
                    by_key948=gPLSQLParser.by_key();

                    state._fsp--;
                    if (state.failed) return retval;

                    pushFollow(FOLLOW_value_key_in_xml_passing_clause12606);
                    value_key949=gPLSQLParser.value_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, value_key949.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_expression_wrapper_in_xml_passing_clause12622);
            expression_wrapper950=expression_wrapper();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper950.getTree());

            // PLSQL_DMLParser.g:1219:32: ( alias )?
            int alt296=2;
            int LA296_0 = input.LA(1);

            if ( (LA296_0==CHAR_STRING||LA296_0==DELIMITED_ID||LA296_0==INTRODUCER||LA296_0==REGULAR_ID||LA296_0==SQL92_RESERVED_AS) ) {
                alt296=1;
            }
            switch (alt296) {
                case 1 :
                    // PLSQL_DMLParser.g:1219:32: alias
                    {
                    pushFollow(FOLLOW_alias_in_xml_passing_clause12624);
                    alias951=gPLSQLParser.alias();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, alias951.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:1219:39: ( COMMA ! expression_wrapper ( alias )? )
            // PLSQL_DMLParser.g:1219:40: COMMA ! expression_wrapper ( alias )?
            {
            COMMA952=(Token)match(input,COMMA,FOLLOW_COMMA_in_xml_passing_clause12628); if (state.failed) return retval;

            pushFollow(FOLLOW_expression_wrapper_in_xml_passing_clause12631);
            expression_wrapper953=expression_wrapper();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper953.getTree());

            // PLSQL_DMLParser.g:1219:66: ( alias )?
            int alt297=2;
            int LA297_0 = input.LA(1);

            if ( (LA297_0==CHAR_STRING||LA297_0==DELIMITED_ID||LA297_0==INTRODUCER||LA297_0==SQL92_RESERVED_AS) ) {
                alt297=1;
            }
            else if ( (LA297_0==REGULAR_ID) ) {
                int LA297_2 = input.LA(2);

                if ( (LA297_2==PLSQL_RESERVED_COLUMNS||LA297_2==RIGHT_PAREN) ) {
                    alt297=1;
                }
                else if ( (LA297_2==REGULAR_ID) ) {
                    int LA297_4 = input.LA(3);

                    if ( (LA297_4==REGULAR_ID) ) {
                        alt297=1;
                    }
                }
            }
            switch (alt297) {
                case 1 :
                    // PLSQL_DMLParser.g:1219:66: alias
                    {
                    pushFollow(FOLLOW_alias_in_xml_passing_clause12633);
                    alias954=gPLSQLParser.alias();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, alias954.getTree());

                    }
                    break;

            }


            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "xml_passing_clause"


    public static class xml_attributes_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "xml_attributes_clause"
    // PLSQL_DMLParser.g:1222:1: xml_attributes_clause : xmlattributes_key ^ LEFT_PAREN ! ( entityescaping_key | noentityescaping_key )? ( schemacheck_key | noschemacheck_key )? xml_multiuse_expression_element ( COMMA ! xml_multiuse_expression_element )* RIGHT_PAREN !;
    public final PLSQLParser_PLSQL_DMLParser.xml_attributes_clause_return xml_attributes_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.xml_attributes_clause_return retval = new PLSQLParser_PLSQL_DMLParser.xml_attributes_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN956=null;
        Token COMMA962=null;
        Token RIGHT_PAREN964=null;
        PLSQLParser_PLSQLKeys.xmlattributes_key_return xmlattributes_key955 =null;

        PLSQLParser_PLSQLKeys.entityescaping_key_return entityescaping_key957 =null;

        PLSQLParser_PLSQLKeys.noentityescaping_key_return noentityescaping_key958 =null;

        PLSQLParser_PLSQLKeys.schemacheck_key_return schemacheck_key959 =null;

        PLSQLParser_PLSQLKeys.noschemacheck_key_return noschemacheck_key960 =null;

        PLSQLParser_PLSQL_DMLParser.xml_multiuse_expression_element_return xml_multiuse_expression_element961 =null;

        PLSQLParser_PLSQL_DMLParser.xml_multiuse_expression_element_return xml_multiuse_expression_element963 =null;


        Object LEFT_PAREN956_tree=null;
        Object COMMA962_tree=null;
        Object RIGHT_PAREN964_tree=null;

        try {
            // PLSQL_DMLParser.g:1223:5: ( xmlattributes_key ^ LEFT_PAREN ! ( entityescaping_key | noentityescaping_key )? ( schemacheck_key | noschemacheck_key )? xml_multiuse_expression_element ( COMMA ! xml_multiuse_expression_element )* RIGHT_PAREN !)
            // PLSQL_DMLParser.g:1223:10: xmlattributes_key ^ LEFT_PAREN ! ( entityescaping_key | noentityescaping_key )? ( schemacheck_key | noschemacheck_key )? xml_multiuse_expression_element ( COMMA ! xml_multiuse_expression_element )* RIGHT_PAREN !
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_xmlattributes_key_in_xml_attributes_clause12655);
            xmlattributes_key955=gPLSQLParser.xmlattributes_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmlattributes_key955.getTree(), root_0);

            LEFT_PAREN956=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_xml_attributes_clause12666); if (state.failed) return retval;

            // PLSQL_DMLParser.g:1225:13: ( entityescaping_key | noentityescaping_key )?
            int alt298=3;
            int LA298_0 = input.LA(1);

            if ( (LA298_0==REGULAR_ID) ) {
                int LA298_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("entityescaping"))) ) {
                    alt298=1;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("noentityescaping"))) ) {
                    alt298=2;
                }
            }
            switch (alt298) {
                case 1 :
                    // PLSQL_DMLParser.g:1225:14: entityescaping_key
                    {
                    pushFollow(FOLLOW_entityescaping_key_in_xml_attributes_clause12682);
                    entityescaping_key957=gPLSQLParser.entityescaping_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, entityescaping_key957.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1225:33: noentityescaping_key
                    {
                    pushFollow(FOLLOW_noentityescaping_key_in_xml_attributes_clause12684);
                    noentityescaping_key958=gPLSQLParser.noentityescaping_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, noentityescaping_key958.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:1226:13: ( schemacheck_key | noschemacheck_key )?
            int alt299=3;
            int LA299_0 = input.LA(1);

            if ( (LA299_0==REGULAR_ID) ) {
                int LA299_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("schemacheck"))) ) {
                    alt299=1;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("noschemacheck"))) ) {
                    alt299=2;
                }
            }
            switch (alt299) {
                case 1 :
                    // PLSQL_DMLParser.g:1226:14: schemacheck_key
                    {
                    pushFollow(FOLLOW_schemacheck_key_in_xml_attributes_clause12701);
                    schemacheck_key959=gPLSQLParser.schemacheck_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, schemacheck_key959.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1226:30: noschemacheck_key
                    {
                    pushFollow(FOLLOW_noschemacheck_key_in_xml_attributes_clause12703);
                    noschemacheck_key960=gPLSQLParser.noschemacheck_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, noschemacheck_key960.getTree());

                    }
                    break;

            }


            pushFollow(FOLLOW_xml_multiuse_expression_element_in_xml_attributes_clause12719);
            xml_multiuse_expression_element961=xml_multiuse_expression_element();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, xml_multiuse_expression_element961.getTree());

            // PLSQL_DMLParser.g:1227:45: ( COMMA ! xml_multiuse_expression_element )*
            loop300:
            do {
                int alt300=2;
                int LA300_0 = input.LA(1);

                if ( (LA300_0==COMMA) ) {
                    alt300=1;
                }


                switch (alt300) {
            	case 1 :
            	    // PLSQL_DMLParser.g:1227:46: COMMA ! xml_multiuse_expression_element
            	    {
            	    COMMA962=(Token)match(input,COMMA,FOLLOW_COMMA_in_xml_attributes_clause12722); if (state.failed) return retval;

            	    pushFollow(FOLLOW_xml_multiuse_expression_element_in_xml_attributes_clause12725);
            	    xml_multiuse_expression_element963=xml_multiuse_expression_element();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, xml_multiuse_expression_element963.getTree());

            	    }
            	    break;

            	default :
            	    break loop300;
                }
            } while (true);


            RIGHT_PAREN964=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_xml_attributes_clause12737); if (state.failed) return retval;

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "xml_attributes_clause"


    public static class xml_namespaces_clause_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "xml_namespaces_clause"
    // PLSQL_DMLParser.g:1231:1: xml_namespaces_clause : xmlnamespaces_key ^ LEFT_PAREN ! ( concatenation_wrapper alias )? ( COMMA ! concatenation_wrapper alias )* ( ( default_key )=> xml_general_default_part )? RIGHT_PAREN !;
    public final PLSQLParser_PLSQL_DMLParser.xml_namespaces_clause_return xml_namespaces_clause() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.xml_namespaces_clause_return retval = new PLSQLParser_PLSQL_DMLParser.xml_namespaces_clause_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token LEFT_PAREN966=null;
        Token COMMA969=null;
        Token RIGHT_PAREN973=null;
        PLSQLParser_PLSQLKeys.xmlnamespaces_key_return xmlnamespaces_key965 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper967 =null;

        PLSQLParser_PLSQLCommons.alias_return alias968 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper970 =null;

        PLSQLParser_PLSQLCommons.alias_return alias971 =null;

        PLSQLParser_PLSQL_DMLParser.xml_general_default_part_return xml_general_default_part972 =null;


        Object LEFT_PAREN966_tree=null;
        Object COMMA969_tree=null;
        Object RIGHT_PAREN973_tree=null;

        try {
            // PLSQL_DMLParser.g:1232:5: ( xmlnamespaces_key ^ LEFT_PAREN ! ( concatenation_wrapper alias )? ( COMMA ! concatenation_wrapper alias )* ( ( default_key )=> xml_general_default_part )? RIGHT_PAREN !)
            // PLSQL_DMLParser.g:1232:10: xmlnamespaces_key ^ LEFT_PAREN ! ( concatenation_wrapper alias )? ( COMMA ! concatenation_wrapper alias )* ( ( default_key )=> xml_general_default_part )? RIGHT_PAREN !
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_xmlnamespaces_key_in_xml_namespaces_clause12758);
            xmlnamespaces_key965=gPLSQLParser.xmlnamespaces_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(xmlnamespaces_key965.getTree(), root_0);

            LEFT_PAREN966=(Token)match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_xml_namespaces_clause12769); if (state.failed) return retval;

            // PLSQL_DMLParser.g:1234:13: ( concatenation_wrapper alias )?
            int alt301=2;
            int LA301_0 = input.LA(1);

            if ( (LA301_0==APPROXIMATE_NUM_LIT||(LA301_0 >= CHAR_STRING && LA301_0 <= COLON)||LA301_0==DELIMITED_ID||LA301_0==EXACT_NUM_LIT||LA301_0==INTRODUCER||LA301_0==LEFT_PAREN||LA301_0==MINUS_SIGN||LA301_0==PLUS_SIGN||LA301_0==REGULAR_ID||LA301_0==SQL92_RESERVED_ALL||LA301_0==SQL92_RESERVED_ANY||LA301_0==SQL92_RESERVED_CASE||LA301_0==SQL92_RESERVED_DISTINCT||(LA301_0 >= SQL92_RESERVED_EXISTS && LA301_0 <= SQL92_RESERVED_FALSE)||LA301_0==SQL92_RESERVED_NULL||LA301_0==SQL92_RESERVED_PRIOR||LA301_0==SQL92_RESERVED_TRUE||LA301_0==UNSIGNED_INTEGER) ) {
                alt301=1;
            }
            else if ( (LA301_0==SQL92_RESERVED_DEFAULT) ) {
                alt301=1;
            }
            switch (alt301) {
                case 1 :
                    // PLSQL_DMLParser.g:1234:14: concatenation_wrapper alias
                    {
                    pushFollow(FOLLOW_concatenation_wrapper_in_xml_namespaces_clause12785);
                    concatenation_wrapper967=concatenation_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper967.getTree());

                    pushFollow(FOLLOW_alias_in_xml_namespaces_clause12787);
                    alias968=gPLSQLParser.alias();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, alias968.getTree());

                    }
                    break;

            }


            // PLSQL_DMLParser.g:1235:17: ( COMMA ! concatenation_wrapper alias )*
            loop302:
            do {
                int alt302=2;
                int LA302_0 = input.LA(1);

                if ( (LA302_0==COMMA) ) {
                    alt302=1;
                }


                switch (alt302) {
            	case 1 :
            	    // PLSQL_DMLParser.g:1235:18: COMMA ! concatenation_wrapper alias
            	    {
            	    COMMA969=(Token)match(input,COMMA,FOLLOW_COMMA_in_xml_namespaces_clause12809); if (state.failed) return retval;

            	    pushFollow(FOLLOW_concatenation_wrapper_in_xml_namespaces_clause12812);
            	    concatenation_wrapper970=concatenation_wrapper();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper970.getTree());

            	    pushFollow(FOLLOW_alias_in_xml_namespaces_clause12814);
            	    alias971=gPLSQLParser.alias();

            	    state._fsp--;
            	    if (state.failed) return retval;
            	    if ( state.backtracking==0 ) adaptor.addChild(root_0, alias971.getTree());

            	    }
            	    break;

            	default :
            	    break loop302;
                }
            } while (true);


            // PLSQL_DMLParser.g:1236:13: ( ( default_key )=> xml_general_default_part )?
            int alt303=2;
            int LA303_0 = input.LA(1);

            if ( (LA303_0==SQL92_RESERVED_DEFAULT) && (synpred23_PLSQL_DMLParser())) {
                alt303=1;
            }
            switch (alt303) {
                case 1 :
                    // PLSQL_DMLParser.g:1236:14: ( default_key )=> xml_general_default_part
                    {
                    pushFollow(FOLLOW_xml_general_default_part_in_xml_namespaces_clause12836);
                    xml_general_default_part972=xml_general_default_part();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, xml_general_default_part972.getTree());

                    }
                    break;

            }


            RIGHT_PAREN973=(Token)match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_xml_namespaces_clause12848); if (state.failed) return retval;

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "xml_namespaces_clause"


    public static class xml_table_column_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "xml_table_column"
    // PLSQL_DMLParser.g:1240:1: xml_table_column : xml_column_name ( for_key ordinality_key | type_spec ( path_key concatenation_wrapper )? ( ( default_key )=> xml_general_default_part )? ) -> ^( XML_COLUMN xml_column_name ( ordinality_key )? ( type_spec )? ( concatenation_wrapper )? ( xml_general_default_part )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.xml_table_column_return xml_table_column() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.xml_table_column_return retval = new PLSQLParser_PLSQL_DMLParser.xml_table_column_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLCommons.xml_column_name_return xml_column_name974 =null;

        PLSQLParser_PLSQLKeys.for_key_return for_key975 =null;

        PLSQLParser_PLSQLKeys.ordinality_key_return ordinality_key976 =null;

        PLSQLParser_PLSQLCommons.type_spec_return type_spec977 =null;

        PLSQLParser_PLSQLKeys.path_key_return path_key978 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper979 =null;

        PLSQLParser_PLSQL_DMLParser.xml_general_default_part_return xml_general_default_part980 =null;


        RewriteRuleSubtreeStream stream_type_spec=new RewriteRuleSubtreeStream(adaptor,"rule type_spec");
        RewriteRuleSubtreeStream stream_concatenation_wrapper=new RewriteRuleSubtreeStream(adaptor,"rule concatenation_wrapper");
        RewriteRuleSubtreeStream stream_xml_column_name=new RewriteRuleSubtreeStream(adaptor,"rule xml_column_name");
        RewriteRuleSubtreeStream stream_path_key=new RewriteRuleSubtreeStream(adaptor,"rule path_key");
        RewriteRuleSubtreeStream stream_ordinality_key=new RewriteRuleSubtreeStream(adaptor,"rule ordinality_key");
        RewriteRuleSubtreeStream stream_xml_general_default_part=new RewriteRuleSubtreeStream(adaptor,"rule xml_general_default_part");
        RewriteRuleSubtreeStream stream_for_key=new RewriteRuleSubtreeStream(adaptor,"rule for_key");
        try {
            // PLSQL_DMLParser.g:1241:5: ( xml_column_name ( for_key ordinality_key | type_spec ( path_key concatenation_wrapper )? ( ( default_key )=> xml_general_default_part )? ) -> ^( XML_COLUMN xml_column_name ( ordinality_key )? ( type_spec )? ( concatenation_wrapper )? ( xml_general_default_part )? ) )
            // PLSQL_DMLParser.g:1241:10: xml_column_name ( for_key ordinality_key | type_spec ( path_key concatenation_wrapper )? ( ( default_key )=> xml_general_default_part )? )
            {
            pushFollow(FOLLOW_xml_column_name_in_xml_table_column12869);
            xml_column_name974=gPLSQLParser.xml_column_name();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_xml_column_name.add(xml_column_name974.getTree());

            // PLSQL_DMLParser.g:1242:5: ( for_key ordinality_key | type_spec ( path_key concatenation_wrapper )? ( ( default_key )=> xml_general_default_part )? )
            int alt306=2;
            int LA306_0 = input.LA(1);

            if ( (LA306_0==SQL92_RESERVED_FOR) ) {
                alt306=1;
            }
            else if ( (LA306_0==DELIMITED_ID||LA306_0==REGULAR_ID) ) {
                alt306=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 306, 0, input);

                throw nvae;

            }
            switch (alt306) {
                case 1 :
                    // PLSQL_DMLParser.g:1242:10: for_key ordinality_key
                    {
                    pushFollow(FOLLOW_for_key_in_xml_table_column12880);
                    for_key975=gPLSQLParser.for_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_for_key.add(for_key975.getTree());

                    pushFollow(FOLLOW_ordinality_key_in_xml_table_column12882);
                    ordinality_key976=gPLSQLParser.ordinality_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_ordinality_key.add(ordinality_key976.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1243:10: type_spec ( path_key concatenation_wrapper )? ( ( default_key )=> xml_general_default_part )?
                    {
                    pushFollow(FOLLOW_type_spec_in_xml_table_column12893);
                    type_spec977=gPLSQLParser.type_spec();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_type_spec.add(type_spec977.getTree());

                    // PLSQL_DMLParser.g:1243:20: ( path_key concatenation_wrapper )?
                    int alt304=2;
                    int LA304_0 = input.LA(1);

                    if ( (LA304_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("path")))) {
                        alt304=1;
                    }
                    switch (alt304) {
                        case 1 :
                            // PLSQL_DMLParser.g:1243:21: path_key concatenation_wrapper
                            {
                            pushFollow(FOLLOW_path_key_in_xml_table_column12896);
                            path_key978=gPLSQLParser.path_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_path_key.add(path_key978.getTree());

                            pushFollow(FOLLOW_concatenation_wrapper_in_xml_table_column12898);
                            concatenation_wrapper979=concatenation_wrapper();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_concatenation_wrapper.add(concatenation_wrapper979.getTree());

                            }
                            break;

                    }


                    // PLSQL_DMLParser.g:1243:54: ( ( default_key )=> xml_general_default_part )?
                    int alt305=2;
                    int LA305_0 = input.LA(1);

                    if ( (LA305_0==SQL92_RESERVED_DEFAULT) && (synpred24_PLSQL_DMLParser())) {
                        alt305=1;
                    }
                    switch (alt305) {
                        case 1 :
                            // PLSQL_DMLParser.g:1243:55: ( default_key )=> xml_general_default_part
                            {
                            pushFollow(FOLLOW_xml_general_default_part_in_xml_table_column12908);
                            xml_general_default_part980=xml_general_default_part();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_xml_general_default_part.add(xml_general_default_part980.getTree());

                            }
                            break;

                    }


                    }
                    break;

            }


            // AST REWRITE
            // elements: ordinality_key, concatenation_wrapper, type_spec, xml_general_default_part, xml_column_name
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 1245:9: -> ^( XML_COLUMN xml_column_name ( ordinality_key )? ( type_spec )? ( concatenation_wrapper )? ( xml_general_default_part )? )
            {
                // PLSQL_DMLParser.g:1245:12: ^( XML_COLUMN xml_column_name ( ordinality_key )? ( type_spec )? ( concatenation_wrapper )? ( xml_general_default_part )? )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(XML_COLUMN, "XML_COLUMN")
                , root_1);

                adaptor.addChild(root_1, stream_xml_column_name.nextTree());

                // PLSQL_DMLParser.g:1245:41: ( ordinality_key )?
                if ( stream_ordinality_key.hasNext() ) {
                    adaptor.addChild(root_1, stream_ordinality_key.nextTree());

                }
                stream_ordinality_key.reset();

                // PLSQL_DMLParser.g:1245:57: ( type_spec )?
                if ( stream_type_spec.hasNext() ) {
                    adaptor.addChild(root_1, stream_type_spec.nextTree());

                }
                stream_type_spec.reset();

                // PLSQL_DMLParser.g:1245:68: ( concatenation_wrapper )?
                if ( stream_concatenation_wrapper.hasNext() ) {
                    adaptor.addChild(root_1, stream_concatenation_wrapper.nextTree());

                }
                stream_concatenation_wrapper.reset();

                // PLSQL_DMLParser.g:1245:91: ( xml_general_default_part )?
                if ( stream_xml_general_default_part.hasNext() ) {
                    adaptor.addChild(root_1, stream_xml_general_default_part.nextTree());

                }
                stream_xml_general_default_part.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "xml_table_column"


    public static class xml_general_default_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "xml_general_default_part"
    // PLSQL_DMLParser.g:1248:1: xml_general_default_part : default_key ^ concatenation_wrapper ;
    public final PLSQLParser_PLSQL_DMLParser.xml_general_default_part_return xml_general_default_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.xml_general_default_part_return retval = new PLSQLParser_PLSQL_DMLParser.xml_general_default_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.default_key_return default_key981 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper982 =null;



        try {
            // PLSQL_DMLParser.g:1249:5: ( default_key ^ concatenation_wrapper )
            // PLSQL_DMLParser.g:1249:10: default_key ^ concatenation_wrapper
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_default_key_in_xml_general_default_part12964);
            default_key981=gPLSQLParser.default_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(default_key981.getTree(), root_0);

            pushFollow(FOLLOW_concatenation_wrapper_in_xml_general_default_part12967);
            concatenation_wrapper982=concatenation_wrapper();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper982.getTree());

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "xml_general_default_part"


    public static class xml_multiuse_expression_element_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "xml_multiuse_expression_element"
    // PLSQL_DMLParser.g:1252:1: xml_multiuse_expression_element : expression ( as_key ( id_expression | evalname_key concatenation ) )? -> {mode == 1}? ^( XML_ELEMENT ^( EXPR expression ) ^( XML_ALIAS[$as_key.start] id_expression ) ) -> {mode == 2}? ^( XML_ELEMENT ^( EXPR expression ) ^( XML_ALIAS[$as_key.start] ^( evalname_key ^( EXPR concatenation ) ) ) ) -> ^( XML_ELEMENT ^( EXPR expression ) ) ;
    public final PLSQLParser_PLSQL_DMLParser.xml_multiuse_expression_element_return xml_multiuse_expression_element() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.xml_multiuse_expression_element_return retval = new PLSQLParser_PLSQL_DMLParser.xml_multiuse_expression_element_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQL_DMLParser.expression_return expression983 =null;

        PLSQLParser_PLSQLKeys.as_key_return as_key984 =null;

        PLSQLParser_PLSQLCommons.id_expression_return id_expression985 =null;

        PLSQLParser_PLSQLKeys.evalname_key_return evalname_key986 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_return concatenation987 =null;


        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_evalname_key=new RewriteRuleSubtreeStream(adaptor,"rule evalname_key");
        RewriteRuleSubtreeStream stream_id_expression=new RewriteRuleSubtreeStream(adaptor,"rule id_expression");
        RewriteRuleSubtreeStream stream_as_key=new RewriteRuleSubtreeStream(adaptor,"rule as_key");
        RewriteRuleSubtreeStream stream_concatenation=new RewriteRuleSubtreeStream(adaptor,"rule concatenation");
            int mode = 0;    
        try {
            // PLSQL_DMLParser.g:1254:5: ( expression ( as_key ( id_expression | evalname_key concatenation ) )? -> {mode == 1}? ^( XML_ELEMENT ^( EXPR expression ) ^( XML_ALIAS[$as_key.start] id_expression ) ) -> {mode == 2}? ^( XML_ELEMENT ^( EXPR expression ) ^( XML_ALIAS[$as_key.start] ^( evalname_key ^( EXPR concatenation ) ) ) ) -> ^( XML_ELEMENT ^( EXPR expression ) ) )
            // PLSQL_DMLParser.g:1254:10: expression ( as_key ( id_expression | evalname_key concatenation ) )?
            {
            pushFollow(FOLLOW_expression_in_xml_multiuse_expression_element12995);
            expression983=expression();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) stream_expression.add(expression983.getTree());

            // PLSQL_DMLParser.g:1254:21: ( as_key ( id_expression | evalname_key concatenation ) )?
            int alt308=2;
            int LA308_0 = input.LA(1);

            if ( (LA308_0==SQL92_RESERVED_AS) ) {
                alt308=1;
            }
            switch (alt308) {
                case 1 :
                    // PLSQL_DMLParser.g:1254:22: as_key ( id_expression | evalname_key concatenation )
                    {
                    pushFollow(FOLLOW_as_key_in_xml_multiuse_expression_element12998);
                    as_key984=gPLSQLParser.as_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) stream_as_key.add(as_key984.getTree());

                    // PLSQL_DMLParser.g:1254:29: ( id_expression | evalname_key concatenation )
                    int alt307=2;
                    int LA307_0 = input.LA(1);

                    if ( (LA307_0==REGULAR_ID) ) {
                        int LA307_1 = input.LA(2);

                        if ( (LA307_1==COMMA||LA307_1==RIGHT_PAREN) ) {
                            alt307=1;
                        }
                        else if ( (LA307_1==APPROXIMATE_NUM_LIT||(LA307_1 >= CHAR_STRING && LA307_1 <= COLON)||LA307_1==DELIMITED_ID||LA307_1==EXACT_NUM_LIT||LA307_1==INTRODUCER||LA307_1==LEFT_PAREN||LA307_1==MINUS_SIGN||LA307_1==PLUS_SIGN||LA307_1==REGULAR_ID||LA307_1==SQL92_RESERVED_ALL||LA307_1==SQL92_RESERVED_ANY||LA307_1==SQL92_RESERVED_CASE||LA307_1==SQL92_RESERVED_DEFAULT||LA307_1==SQL92_RESERVED_DISTINCT||(LA307_1 >= SQL92_RESERVED_EXISTS && LA307_1 <= SQL92_RESERVED_FALSE)||LA307_1==SQL92_RESERVED_NULL||LA307_1==SQL92_RESERVED_PRIOR||LA307_1==SQL92_RESERVED_TRUE||LA307_1==UNSIGNED_INTEGER) && ((input.LT(1).getText().equalsIgnoreCase("evalname")))) {
                            alt307=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 307, 1, input);

                            throw nvae;

                        }
                    }
                    else if ( (LA307_0==DELIMITED_ID) ) {
                        alt307=1;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 307, 0, input);

                        throw nvae;

                    }
                    switch (alt307) {
                        case 1 :
                            // PLSQL_DMLParser.g:1254:30: id_expression
                            {
                            pushFollow(FOLLOW_id_expression_in_xml_multiuse_expression_element13001);
                            id_expression985=gPLSQLParser.id_expression();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_id_expression.add(id_expression985.getTree());

                            if ( state.backtracking==0 ) {mode = 1;}

                            }
                            break;
                        case 2 :
                            // PLSQL_DMLParser.g:1254:56: evalname_key concatenation
                            {
                            pushFollow(FOLLOW_evalname_key_in_xml_multiuse_expression_element13005);
                            evalname_key986=gPLSQLParser.evalname_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_evalname_key.add(evalname_key986.getTree());

                            pushFollow(FOLLOW_concatenation_in_xml_multiuse_expression_element13007);
                            concatenation987=concatenation();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) stream_concatenation.add(concatenation987.getTree());

                            if ( state.backtracking==0 ) {mode = 2;}

                            }
                            break;

                    }


                    }
                    break;

            }


            // AST REWRITE
            // elements: id_expression, expression, expression, concatenation, evalname_key, expression
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            if ( state.backtracking==0 ) {

            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (Object)adaptor.nil();
            // 1255:9: -> {mode == 1}? ^( XML_ELEMENT ^( EXPR expression ) ^( XML_ALIAS[$as_key.start] id_expression ) )
            if (mode == 1) {
                // PLSQL_DMLParser.g:1255:25: ^( XML_ELEMENT ^( EXPR expression ) ^( XML_ALIAS[$as_key.start] id_expression ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(XML_ELEMENT, "XML_ELEMENT")
                , root_1);

                // PLSQL_DMLParser.g:1255:39: ^( EXPR expression )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_expression.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                // PLSQL_DMLParser.g:1255:58: ^( XML_ALIAS[$as_key.start] id_expression )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(XML_ALIAS, (as_key984!=null?((Token)as_key984.start):null))
                , root_2);

                adaptor.addChild(root_2, stream_id_expression.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }

            else // 1256:9: -> {mode == 2}? ^( XML_ELEMENT ^( EXPR expression ) ^( XML_ALIAS[$as_key.start] ^( evalname_key ^( EXPR concatenation ) ) ) )
            if (mode == 2) {
                // PLSQL_DMLParser.g:1256:25: ^( XML_ELEMENT ^( EXPR expression ) ^( XML_ALIAS[$as_key.start] ^( evalname_key ^( EXPR concatenation ) ) ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(XML_ELEMENT, "XML_ELEMENT")
                , root_1);

                // PLSQL_DMLParser.g:1256:39: ^( EXPR expression )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_expression.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                // PLSQL_DMLParser.g:1256:58: ^( XML_ALIAS[$as_key.start] ^( evalname_key ^( EXPR concatenation ) ) )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(XML_ALIAS, (as_key984!=null?((Token)as_key984.start):null))
                , root_2);

                // PLSQL_DMLParser.g:1256:85: ^( evalname_key ^( EXPR concatenation ) )
                {
                Object root_3 = (Object)adaptor.nil();
                root_3 = (Object)adaptor.becomeRoot(stream_evalname_key.nextNode(), root_3);

                // PLSQL_DMLParser.g:1256:100: ^( EXPR concatenation )
                {
                Object root_4 = (Object)adaptor.nil();
                root_4 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_4);

                adaptor.addChild(root_4, stream_concatenation.nextTree());

                adaptor.addChild(root_3, root_4);
                }

                adaptor.addChild(root_2, root_3);
                }

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }

            else // 1257:9: -> ^( XML_ELEMENT ^( EXPR expression ) )
            {
                // PLSQL_DMLParser.g:1257:12: ^( XML_ELEMENT ^( EXPR expression ) )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(XML_ELEMENT, "XML_ELEMENT")
                , root_1);

                // PLSQL_DMLParser.g:1257:26: ^( EXPR expression )
                {
                Object root_2 = (Object)adaptor.nil();
                root_2 = (Object)adaptor.becomeRoot(
                (Object)adaptor.create(EXPR, "EXPR")
                , root_2);

                adaptor.addChild(root_2, stream_expression.nextTree());

                adaptor.addChild(root_1, root_2);
                }

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;
            }

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "xml_multiuse_expression_element"


    public static class xmlroot_param_version_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "xmlroot_param_version_part"
    // PLSQL_DMLParser.g:1260:1: xmlroot_param_version_part : version_key ^ ( no_key value_key | expression_wrapper ) ;
    public final PLSQLParser_PLSQL_DMLParser.xmlroot_param_version_part_return xmlroot_param_version_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.xmlroot_param_version_part_return retval = new PLSQLParser_PLSQL_DMLParser.xmlroot_param_version_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.version_key_return version_key988 =null;

        PLSQLParser_PLSQLKeys.no_key_return no_key989 =null;

        PLSQLParser_PLSQLKeys.value_key_return value_key990 =null;

        PLSQLParser_PLSQL_DMLParser.expression_wrapper_return expression_wrapper991 =null;



        try {
            // PLSQL_DMLParser.g:1261:5: ( version_key ^ ( no_key value_key | expression_wrapper ) )
            // PLSQL_DMLParser.g:1261:10: version_key ^ ( no_key value_key | expression_wrapper )
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_version_key_in_xmlroot_param_version_part13118);
            version_key988=gPLSQLParser.version_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(version_key988.getTree(), root_0);

            // PLSQL_DMLParser.g:1261:23: ( no_key value_key | expression_wrapper )
            int alt309=2;
            int LA309_0 = input.LA(1);

            if ( (LA309_0==REGULAR_ID) ) {
                int LA309_1 = input.LA(2);

                if ( (LA309_1==REGULAR_ID) ) {
                    int LA309_3 = input.LA(3);

                    if ( ((input.LT(1).getText().equalsIgnoreCase("no"))) ) {
                        alt309=1;
                    }
                    else if ( (true) ) {
                        alt309=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 309, 3, input);

                        throw nvae;

                    }
                }
                else if ( (LA309_1==MINUS_SIGN||LA309_1==PLUS_SIGN) ) {
                    alt309=2;
                }
                else if ( (LA309_1==DELIMITED_ID||LA309_1==SQL92_RESERVED_ALL||LA309_1==SQL92_RESERVED_DISTINCT||LA309_1==SQL92_RESERVED_PRIOR) && ((((input.LT(1).getText().equalsIgnoreCase("new") && !input.LT(2).getText().equals("."))&&(input.LT(1).getText().equalsIgnoreCase("new") && !input.LT(2).getText().equals(".")))&&(input.LT(1).getText().equalsIgnoreCase("new"))))) {
                    alt309=2;
                }
                else if ( (LA309_1==SQL92_RESERVED_CASE) ) {
                    alt309=2;
                }
                else if ( (LA309_1==APPROXIMATE_NUM_LIT||LA309_1==CHAR_STRING||LA309_1==EXACT_NUM_LIT||LA309_1==INTRODUCER||LA309_1==SQL92_RESERVED_ANY||LA309_1==SQL92_RESERVED_DEFAULT||(LA309_1 >= SQL92_RESERVED_EXISTS && LA309_1 <= SQL92_RESERVED_FALSE)||LA309_1==SQL92_RESERVED_NULL||LA309_1==SQL92_RESERVED_TRUE||LA309_1==UNSIGNED_INTEGER) && ((((input.LT(1).getText().equalsIgnoreCase("new") && !input.LT(2).getText().equals("."))&&(input.LT(1).getText().equalsIgnoreCase("new") && !input.LT(2).getText().equals(".")))&&(input.LT(1).getText().equalsIgnoreCase("new"))))) {
                    alt309=2;
                }
                else if ( (LA309_1==ASTERISK||(LA309_1 >= COLON && LA309_1 <= COMMA)||LA309_1==CONCATENATION_OP||LA309_1==EQUALS_OP||(LA309_1 >= GREATER_THAN_OP && LA309_1 <= GREATER_THAN_OR_EQUALS_OP)||(LA309_1 >= LEFT_BRACKET && LA309_1 <= LESS_THAN_OR_EQUALS_OP)||LA309_1==NOT_EQUAL_OP||LA309_1==PERIOD||LA309_1==RIGHT_PAREN||LA309_1==SOLIDUS||LA309_1==SQL92_RESERVED_AND||LA309_1==SQL92_RESERVED_BETWEEN||LA309_1==SQL92_RESERVED_IN||(LA309_1 >= SQL92_RESERVED_IS && LA309_1 <= SQL92_RESERVED_NOT)||LA309_1==SQL92_RESERVED_OR) ) {
                    alt309=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 309, 1, input);

                    throw nvae;

                }
            }
            else if ( (LA309_0==APPROXIMATE_NUM_LIT||(LA309_0 >= CHAR_STRING && LA309_0 <= COLON)||LA309_0==DELIMITED_ID||LA309_0==EXACT_NUM_LIT||LA309_0==INTRODUCER||LA309_0==LEFT_PAREN||LA309_0==MINUS_SIGN||LA309_0==PLUS_SIGN||LA309_0==SQL92_RESERVED_ALL||LA309_0==SQL92_RESERVED_ANY||LA309_0==SQL92_RESERVED_CASE||LA309_0==SQL92_RESERVED_DEFAULT||LA309_0==SQL92_RESERVED_DISTINCT||(LA309_0 >= SQL92_RESERVED_EXISTS && LA309_0 <= SQL92_RESERVED_FALSE)||(LA309_0 >= SQL92_RESERVED_NOT && LA309_0 <= SQL92_RESERVED_NULL)||LA309_0==SQL92_RESERVED_PRIOR||LA309_0==SQL92_RESERVED_TRUE||LA309_0==UNSIGNED_INTEGER) ) {
                alt309=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 309, 0, input);

                throw nvae;

            }
            switch (alt309) {
                case 1 :
                    // PLSQL_DMLParser.g:1261:24: no_key value_key
                    {
                    pushFollow(FOLLOW_no_key_in_xmlroot_param_version_part13122);
                    no_key989=gPLSQLParser.no_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, no_key989.getTree());

                    pushFollow(FOLLOW_value_key_in_xmlroot_param_version_part13124);
                    value_key990=gPLSQLParser.value_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, value_key990.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1261:41: expression_wrapper
                    {
                    pushFollow(FOLLOW_expression_wrapper_in_xmlroot_param_version_part13126);
                    expression_wrapper991=expression_wrapper();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, expression_wrapper991.getTree());

                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "xmlroot_param_version_part"


    public static class xmlroot_param_standalone_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "xmlroot_param_standalone_part"
    // PLSQL_DMLParser.g:1264:1: xmlroot_param_standalone_part : standalone_key ^ ( yes_key | no_key ( value_key )? ) ;
    public final PLSQLParser_PLSQL_DMLParser.xmlroot_param_standalone_part_return xmlroot_param_standalone_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.xmlroot_param_standalone_part_return retval = new PLSQLParser_PLSQL_DMLParser.xmlroot_param_standalone_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.standalone_key_return standalone_key992 =null;

        PLSQLParser_PLSQLKeys.yes_key_return yes_key993 =null;

        PLSQLParser_PLSQLKeys.no_key_return no_key994 =null;

        PLSQLParser_PLSQLKeys.value_key_return value_key995 =null;



        try {
            // PLSQL_DMLParser.g:1265:5: ( standalone_key ^ ( yes_key | no_key ( value_key )? ) )
            // PLSQL_DMLParser.g:1265:10: standalone_key ^ ( yes_key | no_key ( value_key )? )
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_standalone_key_in_xmlroot_param_standalone_part13147);
            standalone_key992=gPLSQLParser.standalone_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(standalone_key992.getTree(), root_0);

            // PLSQL_DMLParser.g:1265:26: ( yes_key | no_key ( value_key )? )
            int alt311=2;
            int LA311_0 = input.LA(1);

            if ( (LA311_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("no"))||(input.LT(1).getText().equalsIgnoreCase("yes"))))) {
                int LA311_1 = input.LA(2);

                if ( ((input.LT(1).getText().equalsIgnoreCase("yes"))) ) {
                    alt311=1;
                }
                else if ( ((input.LT(1).getText().equalsIgnoreCase("no"))) ) {
                    alt311=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 311, 1, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 311, 0, input);

                throw nvae;

            }
            switch (alt311) {
                case 1 :
                    // PLSQL_DMLParser.g:1265:27: yes_key
                    {
                    pushFollow(FOLLOW_yes_key_in_xmlroot_param_standalone_part13151);
                    yes_key993=gPLSQLParser.yes_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, yes_key993.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1265:35: no_key ( value_key )?
                    {
                    pushFollow(FOLLOW_no_key_in_xmlroot_param_standalone_part13153);
                    no_key994=gPLSQLParser.no_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, no_key994.getTree());

                    // PLSQL_DMLParser.g:1265:42: ( value_key )?
                    int alt310=2;
                    int LA310_0 = input.LA(1);

                    if ( (LA310_0==REGULAR_ID) ) {
                        alt310=1;
                    }
                    switch (alt310) {
                        case 1 :
                            // PLSQL_DMLParser.g:1265:42: value_key
                            {
                            pushFollow(FOLLOW_value_key_in_xmlroot_param_standalone_part13155);
                            value_key995=gPLSQLParser.value_key();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, value_key995.getTree());

                            }
                            break;

                    }


                    }
                    break;

            }


            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "xmlroot_param_standalone_part"


    public static class xmlserialize_param_enconding_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "xmlserialize_param_enconding_part"
    // PLSQL_DMLParser.g:1268:1: xmlserialize_param_enconding_part : encoding_key ^ concatenation_wrapper ;
    public final PLSQLParser_PLSQL_DMLParser.xmlserialize_param_enconding_part_return xmlserialize_param_enconding_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.xmlserialize_param_enconding_part_return retval = new PLSQLParser_PLSQL_DMLParser.xmlserialize_param_enconding_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.encoding_key_return encoding_key996 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper997 =null;



        try {
            // PLSQL_DMLParser.g:1269:5: ( encoding_key ^ concatenation_wrapper )
            // PLSQL_DMLParser.g:1269:10: encoding_key ^ concatenation_wrapper
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_encoding_key_in_xmlserialize_param_enconding_part13177);
            encoding_key996=gPLSQLParser.encoding_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(encoding_key996.getTree(), root_0);

            pushFollow(FOLLOW_concatenation_wrapper_in_xmlserialize_param_enconding_part13180);
            concatenation_wrapper997=concatenation_wrapper();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper997.getTree());

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "xmlserialize_param_enconding_part"


    public static class xmlserialize_param_version_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "xmlserialize_param_version_part"
    // PLSQL_DMLParser.g:1272:1: xmlserialize_param_version_part : version_key ^ concatenation_wrapper ;
    public final PLSQLParser_PLSQL_DMLParser.xmlserialize_param_version_part_return xmlserialize_param_version_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.xmlserialize_param_version_part_return retval = new PLSQLParser_PLSQL_DMLParser.xmlserialize_param_version_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        PLSQLParser_PLSQLKeys.version_key_return version_key998 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper999 =null;



        try {
            // PLSQL_DMLParser.g:1273:5: ( version_key ^ concatenation_wrapper )
            // PLSQL_DMLParser.g:1273:10: version_key ^ concatenation_wrapper
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_version_key_in_xmlserialize_param_version_part13200);
            version_key998=gPLSQLParser.version_key();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(version_key998.getTree(), root_0);

            pushFollow(FOLLOW_concatenation_wrapper_in_xmlserialize_param_version_part13203);
            concatenation_wrapper999=concatenation_wrapper();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper999.getTree());

            }

            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "xmlserialize_param_version_part"


    public static class xmlserialize_param_ident_part_return extends ParserRuleReturnScope {
        Object tree;
        public Object getTree() { return tree; }
    };


    // $ANTLR start "xmlserialize_param_ident_part"
    // PLSQL_DMLParser.g:1276:1: xmlserialize_param_ident_part : ( no_key indent_key | indent_key ^ ( size_key ! EQUALS_OP ! concatenation_wrapper )? );
    public final PLSQLParser_PLSQL_DMLParser.xmlserialize_param_ident_part_return xmlserialize_param_ident_part() throws RecognitionException {
        PLSQLParser_PLSQL_DMLParser.xmlserialize_param_ident_part_return retval = new PLSQLParser_PLSQL_DMLParser.xmlserialize_param_ident_part_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token EQUALS_OP1004=null;
        PLSQLParser_PLSQLKeys.no_key_return no_key1000 =null;

        PLSQLParser_PLSQLKeys.indent_key_return indent_key1001 =null;

        PLSQLParser_PLSQLKeys.indent_key_return indent_key1002 =null;

        PLSQLParser_PLSQLKeys.size_key_return size_key1003 =null;

        PLSQLParser_PLSQL_DMLParser.concatenation_wrapper_return concatenation_wrapper1005 =null;


        Object EQUALS_OP1004_tree=null;

        try {
            // PLSQL_DMLParser.g:1277:5: ( no_key indent_key | indent_key ^ ( size_key ! EQUALS_OP ! concatenation_wrapper )? )
            int alt313=2;
            int LA313_0 = input.LA(1);

            if ( (LA313_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("no"))||(input.LT(1).getText().equalsIgnoreCase("indent"))))) {
                int LA313_1 = input.LA(2);

                if ( (LA313_1==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("no"))||(input.LT(1).getText().equalsIgnoreCase("indent"))))) {
                    int LA313_2 = input.LA(3);

                    if ( (LA313_2==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("no"))||(input.LT(1).getText().equalsIgnoreCase("indent"))))) {
                        int LA313_4 = input.LA(4);

                        if ( (LA313_4==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("no")))) {
                            alt313=1;
                        }
                        else if ( (LA313_4==RIGHT_PAREN) && ((input.LT(1).getText().equalsIgnoreCase("indent")))) {
                            alt313=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return retval;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 313, 4, input);

                            throw nvae;

                        }
                    }
                    else if ( (LA313_2==RIGHT_PAREN) && ((input.LT(1).getText().equalsIgnoreCase("no")))) {
                        alt313=1;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return retval;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 313, 2, input);

                        throw nvae;

                    }
                }
                else if ( (LA313_1==RIGHT_PAREN||LA313_1==SQL92_RESERVED_SIZE) && ((input.LT(1).getText().equalsIgnoreCase("indent")))) {
                    alt313=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return retval;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 313, 1, input);

                    throw nvae;

                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return retval;}
                NoViableAltException nvae =
                    new NoViableAltException("", 313, 0, input);

                throw nvae;

            }
            switch (alt313) {
                case 1 :
                    // PLSQL_DMLParser.g:1277:10: no_key indent_key
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_no_key_in_xmlserialize_param_ident_part13223);
                    no_key1000=gPLSQLParser.no_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, no_key1000.getTree());

                    pushFollow(FOLLOW_indent_key_in_xmlserialize_param_ident_part13225);
                    indent_key1001=gPLSQLParser.indent_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) adaptor.addChild(root_0, indent_key1001.getTree());

                    }
                    break;
                case 2 :
                    // PLSQL_DMLParser.g:1278:10: indent_key ^ ( size_key ! EQUALS_OP ! concatenation_wrapper )?
                    {
                    root_0 = (Object)adaptor.nil();


                    pushFollow(FOLLOW_indent_key_in_xmlserialize_param_ident_part13236);
                    indent_key1002=gPLSQLParser.indent_key();

                    state._fsp--;
                    if (state.failed) return retval;
                    if ( state.backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(indent_key1002.getTree(), root_0);

                    // PLSQL_DMLParser.g:1278:22: ( size_key ! EQUALS_OP ! concatenation_wrapper )?
                    int alt312=2;
                    int LA312_0 = input.LA(1);

                    if ( (LA312_0==SQL92_RESERVED_SIZE) ) {
                        alt312=1;
                    }
                    switch (alt312) {
                        case 1 :
                            // PLSQL_DMLParser.g:1278:23: size_key ! EQUALS_OP ! concatenation_wrapper
                            {
                            pushFollow(FOLLOW_size_key_in_xmlserialize_param_ident_part13240);
                            size_key1003=gPLSQLParser.size_key();

                            state._fsp--;
                            if (state.failed) return retval;

                            EQUALS_OP1004=(Token)match(input,EQUALS_OP,FOLLOW_EQUALS_OP_in_xmlserialize_param_ident_part13243); if (state.failed) return retval;

                            pushFollow(FOLLOW_concatenation_wrapper_in_xmlserialize_param_ident_part13246);
                            concatenation_wrapper1005=concatenation_wrapper();

                            state._fsp--;
                            if (state.failed) return retval;
                            if ( state.backtracking==0 ) adaptor.addChild(root_0, concatenation_wrapper1005.getTree());

                            }
                            break;

                    }


                    }
                    break;

            }
            retval.stop = input.LT(-1);


            if ( state.backtracking==0 ) {

            retval.tree = (Object)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }
    // $ANTLR end "xmlserialize_param_ident_part"

    // $ANTLR start synpred1_PLSQL_DMLParser
    public final void synpred1_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:182:28: ( order_key ( siblings_key )? by_key )
        // PLSQL_DMLParser.g:182:29: order_key ( siblings_key )? by_key
        {
        pushFollow(FOLLOW_order_key_in_synpred1_PLSQL_DMLParser714);
        gPLSQLParser.order_key();

        state._fsp--;
        if (state.failed) return ;

        // PLSQL_DMLParser.g:182:39: ( siblings_key )?
        int alt314=2;
        int LA314_0 = input.LA(1);

        if ( (LA314_0==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("siblings")))) {
            alt314=1;
        }
        switch (alt314) {
            case 1 :
                // PLSQL_DMLParser.g:182:39: siblings_key
                {
                pushFollow(FOLLOW_siblings_key_in_synpred1_PLSQL_DMLParser716);
                gPLSQLParser.siblings_key();

                state._fsp--;
                if (state.failed) return ;

                }
                break;

        }


        pushFollow(FOLLOW_by_key_in_synpred1_PLSQL_DMLParser719);
        gPLSQLParser.by_key();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred1_PLSQL_DMLParser

    // $ANTLR start synpred2_PLSQL_DMLParser
    public final void synpred2_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:213:10: ( distinct_key | unique_key | all_key )
        int alt315=3;
        switch ( input.LA(1) ) {
        case SQL92_RESERVED_DISTINCT:
            {
            alt315=1;
            }
            break;
        case SQL92_RESERVED_UNIQUE:
            {
            alt315=2;
            }
            break;
        case SQL92_RESERVED_ALL:
            {
            alt315=3;
            }
            break;
        default:
            if (state.backtracking>0) {state.failed=true; return ;}
            NoViableAltException nvae =
                new NoViableAltException("", 315, 0, input);

            throw nvae;

        }

        switch (alt315) {
            case 1 :
                // PLSQL_DMLParser.g:213:11: distinct_key
                {
                pushFollow(FOLLOW_distinct_key_in_synpred2_PLSQL_DMLParser983);
                gPLSQLParser.distinct_key();

                state._fsp--;
                if (state.failed) return ;

                }
                break;
            case 2 :
                // PLSQL_DMLParser.g:213:24: unique_key
                {
                pushFollow(FOLLOW_unique_key_in_synpred2_PLSQL_DMLParser985);
                gPLSQLParser.unique_key();

                state._fsp--;
                if (state.failed) return ;

                }
                break;
            case 3 :
                // PLSQL_DMLParser.g:213:35: all_key
                {
                pushFollow(FOLLOW_all_key_in_synpred2_PLSQL_DMLParser987);
                gPLSQLParser.all_key();

                state._fsp--;
                if (state.failed) return ;

                }
                break;

        }
    }
    // $ANTLR end synpred2_PLSQL_DMLParser

    // $ANTLR start synpred3_PLSQL_DMLParser
    public final void synpred3_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:238:10: ( tableview_name PERIOD ASTERISK )
        // PLSQL_DMLParser.g:238:11: tableview_name PERIOD ASTERISK
        {
        pushFollow(FOLLOW_tableview_name_in_synpred3_PLSQL_DMLParser1320);
        gPLSQLParser.tableview_name();

        state._fsp--;
        if (state.failed) return ;

        match(input,PERIOD,FOLLOW_PERIOD_in_synpred3_PLSQL_DMLParser1322); if (state.failed) return ;

        match(input,ASTERISK,FOLLOW_ASTERISK_in_synpred3_PLSQL_DMLParser1324); if (state.failed) return ;

        }

    }
    // $ANTLR end synpred3_PLSQL_DMLParser

    // $ANTLR start synpred4_PLSQL_DMLParser
    public final void synpred4_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:292:10: ( LEFT_PAREN )
        // PLSQL_DMLParser.g:292:11: LEFT_PAREN
        {
        match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_synpred4_PLSQL_DMLParser1867); if (state.failed) return ;

        }

    }
    // $ANTLR end synpred4_PLSQL_DMLParser

    // $ANTLR start synpred5_PLSQL_DMLParser
    public final void synpred5_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:330:18: ( select_key )
        // PLSQL_DMLParser.g:330:19: select_key
        {
        pushFollow(FOLLOW_select_key_in_synpred5_PLSQL_DMLParser2330);
        gPLSQLParser.select_key();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred5_PLSQL_DMLParser

    // $ANTLR start synpred6_PLSQL_DMLParser
    public final void synpred6_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:331:18: ( any_key )
        // PLSQL_DMLParser.g:331:19: any_key
        {
        pushFollow(FOLLOW_any_key_in_synpred6_PLSQL_DMLParser2356);
        gPLSQLParser.any_key();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred6_PLSQL_DMLParser

    // $ANTLR start synpred7_PLSQL_DMLParser
    public final void synpred7_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:347:10: ( LEFT_PAREN )
        // PLSQL_DMLParser.g:347:11: LEFT_PAREN
        {
        match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_synpred7_PLSQL_DMLParser2561); if (state.failed) return ;

        }

    }
    // $ANTLR end synpred7_PLSQL_DMLParser

    // $ANTLR start synpred8_PLSQL_DMLParser
    public final void synpred8_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:377:14: ( LEFT_PAREN )
        // PLSQL_DMLParser.g:377:15: LEFT_PAREN
        {
        match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_synpred8_PLSQL_DMLParser2931); if (state.failed) return ;

        }

    }
    // $ANTLR end synpred8_PLSQL_DMLParser

    // $ANTLR start synpred9_PLSQL_DMLParser
    public final void synpred9_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:395:46: ( COMMA group_by_elements )
        // PLSQL_DMLParser.g:395:47: COMMA group_by_elements
        {
        match(input,COMMA,FOLLOW_COMMA_in_synpred9_PLSQL_DMLParser3149); if (state.failed) return ;

        pushFollow(FOLLOW_group_by_elements_in_synpred9_PLSQL_DMLParser3151);
        group_by_elements();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred9_PLSQL_DMLParser

    // $ANTLR start synpred10_PLSQL_DMLParser
    public final void synpred10_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:416:10: ( rollup_key | cube_key )
        int alt316=2;
        int LA316_0 = input.LA(1);

        if ( (LA316_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("cube"))||(input.LT(1).getText().equalsIgnoreCase("rollup"))))) {
            int LA316_1 = input.LA(2);

            if ( ((input.LT(1).getText().equalsIgnoreCase("rollup"))) ) {
                alt316=1;
            }
            else if ( ((input.LT(1).getText().equalsIgnoreCase("cube"))) ) {
                alt316=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 316, 1, input);

                throw nvae;

            }
        }
        else {
            if (state.backtracking>0) {state.failed=true; return ;}
            NoViableAltException nvae =
                new NoViableAltException("", 316, 0, input);

            throw nvae;

        }
        switch (alt316) {
            case 1 :
                // PLSQL_DMLParser.g:416:11: rollup_key
                {
                pushFollow(FOLLOW_rollup_key_in_synpred10_PLSQL_DMLParser3360);
                gPLSQLParser.rollup_key();

                state._fsp--;
                if (state.failed) return ;

                }
                break;
            case 2 :
                // PLSQL_DMLParser.g:416:22: cube_key
                {
                pushFollow(FOLLOW_cube_key_in_synpred10_PLSQL_DMLParser3362);
                gPLSQLParser.cube_key();

                state._fsp--;
                if (state.failed) return ;

                }
                break;

        }
    }
    // $ANTLR end synpred10_PLSQL_DMLParser

    // $ANTLR start synpred11_PLSQL_DMLParser
    public final void synpred11_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:417:10: ( LEFT_PAREN )
        // PLSQL_DMLParser.g:417:11: LEFT_PAREN
        {
        match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_synpred11_PLSQL_DMLParser3378); if (state.failed) return ;

        }

    }
    // $ANTLR end synpred11_PLSQL_DMLParser

    // $ANTLR start synpred12_PLSQL_DMLParser
    public final void synpred12_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:482:34: ( all_key )
        // PLSQL_DMLParser.g:482:35: all_key
        {
        pushFollow(FOLLOW_all_key_in_synpred12_PLSQL_DMLParser4047);
        gPLSQLParser.all_key();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred12_PLSQL_DMLParser

    // $ANTLR start synpred13_PLSQL_DMLParser
    public final void synpred13_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:704:10: ( LEFT_PAREN )
        // PLSQL_DMLParser.g:704:11: LEFT_PAREN
        {
        match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_synpred13_PLSQL_DMLParser6203); if (state.failed) return ;

        }

    }
    // $ANTLR end synpred13_PLSQL_DMLParser

    // $ANTLR start synpred14_PLSQL_DMLParser
    public final void synpred14_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:714:34: ( unlimited_key )
        // PLSQL_DMLParser.g:714:35: unlimited_key
        {
        pushFollow(FOLLOW_unlimited_key_in_synpred14_PLSQL_DMLParser6294);
        gPLSQLParser.unlimited_key();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred14_PLSQL_DMLParser

    // $ANTLR start synpred15_PLSQL_DMLParser
    public final void synpred15_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:863:22: ( select_key )
        // PLSQL_DMLParser.g:863:23: select_key
        {
        pushFollow(FOLLOW_select_key_in_synpred15_PLSQL_DMLParser8070);
        gPLSQLParser.select_key();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred15_PLSQL_DMLParser

    // $ANTLR start synpred16_PLSQL_DMLParser
    public final void synpred16_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:894:10: ( interval_expression )
        // PLSQL_DMLParser.g:894:11: interval_expression
        {
        pushFollow(FOLLOW_interval_expression_in_synpred16_PLSQL_DMLParser8407);
        interval_expression();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred16_PLSQL_DMLParser

    // $ANTLR start synpred17_PLSQL_DMLParser
    public final void synpred17_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:913:11: ( any_key )
        // PLSQL_DMLParser.g:913:12: any_key
        {
        pushFollow(FOLLOW_any_key_in_synpred17_PLSQL_DMLParser8646);
        gPLSQLParser.any_key();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred17_PLSQL_DMLParser

    // $ANTLR start synpred18_PLSQL_DMLParser
    public final void synpred18_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:913:59: ( any_key )
        // PLSQL_DMLParser.g:913:60: any_key
        {
        pushFollow(FOLLOW_any_key_in_synpred18_PLSQL_DMLParser8661);
        gPLSQLParser.any_key();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred18_PLSQL_DMLParser

    // $ANTLR start synpred19_PLSQL_DMLParser
    public final void synpred19_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:942:18: ( select_key )
        // PLSQL_DMLParser.g:942:19: select_key
        {
        pushFollow(FOLLOW_select_key_in_synpred19_PLSQL_DMLParser9015);
        gPLSQLParser.select_key();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred19_PLSQL_DMLParser

    // $ANTLR start synpred20_PLSQL_DMLParser
    public final void synpred20_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:943:18: ( LEFT_PAREN )
        // PLSQL_DMLParser.g:943:19: LEFT_PAREN
        {
        match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_synpred20_PLSQL_DMLParser9039); if (state.failed) return ;

        }

    }
    // $ANTLR end synpred20_PLSQL_DMLParser

    // $ANTLR start synpred21_PLSQL_DMLParser
    public final void synpred21_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:976:10: ( ( label_name )? case_key when_key )
        // PLSQL_DMLParser.g:976:11: ( label_name )? case_key when_key
        {
        // PLSQL_DMLParser.g:976:11: ( label_name )?
        int alt317=2;
        int LA317_0 = input.LA(1);

        if ( (LA317_0==DELIMITED_ID||LA317_0==REGULAR_ID) ) {
            alt317=1;
        }
        switch (alt317) {
            case 1 :
                // PLSQL_DMLParser.g:976:11: label_name
                {
                pushFollow(FOLLOW_label_name_in_synpred21_PLSQL_DMLParser9411);
                gPLSQLParser.label_name();

                state._fsp--;
                if (state.failed) return ;

                }
                break;

        }


        pushFollow(FOLLOW_case_key_in_synpred21_PLSQL_DMLParser9414);
        gPLSQLParser.case_key();

        state._fsp--;
        if (state.failed) return ;

        pushFollow(FOLLOW_when_key_in_synpred21_PLSQL_DMLParser9416);
        gPLSQLParser.when_key();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred21_PLSQL_DMLParser

    // $ANTLR start synpred22_PLSQL_DMLParser
    public final void synpred22_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:1014:23: ( select_key )
        // PLSQL_DMLParser.g:1014:24: select_key
        {
        pushFollow(FOLLOW_select_key_in_synpred22_PLSQL_DMLParser9774);
        gPLSQLParser.select_key();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred22_PLSQL_DMLParser

    // $ANTLR start synpred23_PLSQL_DMLParser
    public final void synpred23_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:1236:14: ( default_key )
        // PLSQL_DMLParser.g:1236:15: default_key
        {
        pushFollow(FOLLOW_default_key_in_synpred23_PLSQL_DMLParser12832);
        gPLSQLParser.default_key();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred23_PLSQL_DMLParser

    // $ANTLR start synpred24_PLSQL_DMLParser
    public final void synpred24_PLSQL_DMLParser_fragment() throws RecognitionException {
        // PLSQL_DMLParser.g:1243:55: ( default_key )
        // PLSQL_DMLParser.g:1243:56: default_key
        {
        pushFollow(FOLLOW_default_key_in_synpred24_PLSQL_DMLParser12904);
        gPLSQLParser.default_key();

        state._fsp--;
        if (state.failed) return ;

        }

    }
    // $ANTLR end synpred24_PLSQL_DMLParser

    // Delegated rules

    public final boolean synpred11_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred11_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred3_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred3_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred13_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred13_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred20_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred20_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred5_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred5_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred22_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred22_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred1_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred1_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred12_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred12_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred14_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred14_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred21_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred21_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred16_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred16_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred4_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred4_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred7_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred7_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred19_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred19_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred8_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred8_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred9_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred9_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred15_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred15_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred2_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred2_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred6_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred6_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred23_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred23_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred10_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred10_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred18_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred18_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred24_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred24_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred17_PLSQL_DMLParser() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred17_PLSQL_DMLParser_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }


    protected DFA22 dfa22 = new DFA22(this);
    protected DFA27 dfa27 = new DFA27(this);
    protected DFA72 dfa72 = new DFA72(this);
    protected DFA130 dfa130 = new DFA130(this);
    protected DFA151 dfa151 = new DFA151(this);
    protected DFA193 dfa193 = new DFA193(this);
    protected DFA232 dfa232 = new DFA232(this);
    protected DFA263 dfa263 = new DFA263(this);
    static final String DFA22_eotS =
        "\21\uffff";
    static final String DFA22_eofS =
        "\1\1\3\uffff\2\7\6\uffff\3\7\2\uffff";
    static final String DFA22_minS =
        "\1\12\1\uffff\2\17\2\10\1\17\1\uffff\4\17\3\10\2\17";
    static final String DFA22_maxS =
        "\1\u0085\1\uffff\1\172\1\74\3\u0085\1\uffff\4\74\3\u0085\2\74";
    static final String DFA22_acceptS =
        "\1\uffff\1\2\5\uffff\1\1\11\uffff";
    static final String DFA22_specialS =
        "\21\uffff}>";
    static final String[] DFA22_transitionS = {
            "\1\1\1\uffff\1\2\2\uffff\1\1\10\uffff\1\1\1\uffff\1\1\11\uffff"+
            "\1\1\13\uffff\2\1\5\uffff\1\1\4\uffff\1\1\1\uffff\2\1\10\uffff"+
            "\1\1\5\uffff\1\1\1\uffff\1\1\4\uffff\1\1\3\uffff\2\1\4\uffff"+
            "\1\1\3\uffff\2\1\1\uffff\2\1\6\uffff\1\1\2\uffff\1\1\5\uffff"+
            "\1\1\6\uffff\1\1\1\uffff\1\1\2\uffff\3\1",
            "",
            "\1\5\10\uffff\1\3\1\uffff\1\6\41\uffff\1\4\75\uffff\1\7",
            "\1\11\54\uffff\1\10",
            "\1\7\1\uffff\1\7\1\uffff\1\7\2\uffff\1\7\2\uffff\1\1\5\uffff"+
            "\1\7\1\uffff\1\7\7\uffff\1\12\1\uffff\1\7\13\uffff\2\7\5\uffff"+
            "\1\7\4\uffff\1\7\1\uffff\2\7\10\uffff\1\7\5\uffff\1\7\1\uffff"+
            "\1\7\4\uffff\1\7\3\uffff\2\7\4\uffff\1\7\3\uffff\2\7\1\uffff"+
            "\2\7\6\uffff\1\7\2\uffff\1\7\5\uffff\1\7\6\uffff\1\7\1\uffff"+
            "\1\7\2\uffff\3\7",
            "\1\7\1\uffff\1\7\1\uffff\1\7\2\uffff\1\7\2\uffff\1\1\5\uffff"+
            "\1\7\1\uffff\1\7\7\uffff\1\12\1\uffff\1\7\13\uffff\2\7\5\uffff"+
            "\1\7\4\uffff\1\7\1\uffff\2\7\10\uffff\1\7\5\uffff\1\7\1\uffff"+
            "\1\7\4\uffff\1\7\3\uffff\2\7\4\uffff\1\7\3\uffff\2\7\1\uffff"+
            "\2\7\6\uffff\1\7\2\uffff\1\7\5\uffff\1\7\6\uffff\1\7\1\uffff"+
            "\1\7\2\uffff\3\7",
            "\1\1\10\uffff\1\1\1\uffff\1\7\41\uffff\1\1\72\uffff\1\7\15"+
            "\uffff\1\7",
            "",
            "\1\5\22\uffff\1\13\31\uffff\1\14",
            "\1\5\22\uffff\1\13\31\uffff\1\14",
            "\1\16\54\uffff\1\15",
            "\1\20\54\uffff\1\17",
            "\1\7\1\uffff\1\7\1\uffff\1\7\2\uffff\1\7\2\uffff\1\1\5\uffff"+
            "\1\7\1\uffff\1\7\7\uffff\1\12\1\uffff\1\7\13\uffff\2\7\5\uffff"+
            "\1\7\4\uffff\1\7\1\uffff\2\7\10\uffff\1\7\5\uffff\1\7\1\uffff"+
            "\1\7\4\uffff\1\7\3\uffff\2\7\4\uffff\1\7\3\uffff\2\7\1\uffff"+
            "\2\7\6\uffff\1\7\2\uffff\1\7\5\uffff\1\7\6\uffff\1\7\1\uffff"+
            "\1\7\2\uffff\3\7",
            "\1\7\1\uffff\1\7\1\uffff\1\7\2\uffff\1\7\2\uffff\1\1\5\uffff"+
            "\1\7\1\uffff\1\7\7\uffff\1\1\1\uffff\1\7\13\uffff\2\7\5\uffff"+
            "\1\7\4\uffff\1\7\1\uffff\2\7\10\uffff\1\7\5\uffff\1\7\1\uffff"+
            "\1\7\4\uffff\1\7\3\uffff\2\7\4\uffff\1\7\3\uffff\2\7\1\uffff"+
            "\2\7\6\uffff\1\7\2\uffff\1\7\5\uffff\1\7\6\uffff\1\7\1\uffff"+
            "\1\7\2\uffff\3\7",
            "\1\7\1\uffff\1\7\1\uffff\1\7\2\uffff\1\7\2\uffff\1\1\5\uffff"+
            "\1\7\1\uffff\1\7\7\uffff\1\1\1\uffff\1\7\13\uffff\2\7\5\uffff"+
            "\1\7\4\uffff\1\7\1\uffff\2\7\10\uffff\1\7\5\uffff\1\7\1\uffff"+
            "\1\7\4\uffff\1\7\3\uffff\2\7\4\uffff\1\7\3\uffff\2\7\1\uffff"+
            "\2\7\6\uffff\1\7\2\uffff\1\7\5\uffff\1\7\6\uffff\1\7\1\uffff"+
            "\1\7\2\uffff\3\7",
            "\1\5\22\uffff\1\13\31\uffff\1\14",
            "\1\5\22\uffff\1\13\31\uffff\1\14"
    };

    static final short[] DFA22_eot = DFA.unpackEncodedString(DFA22_eotS);
    static final short[] DFA22_eof = DFA.unpackEncodedString(DFA22_eofS);
    static final char[] DFA22_min = DFA.unpackEncodedStringToUnsignedChars(DFA22_minS);
    static final char[] DFA22_max = DFA.unpackEncodedStringToUnsignedChars(DFA22_maxS);
    static final short[] DFA22_accept = DFA.unpackEncodedString(DFA22_acceptS);
    static final short[] DFA22_special = DFA.unpackEncodedString(DFA22_specialS);
    static final short[][] DFA22_transition;

    static {
        int numStates = DFA22_transitionS.length;
        DFA22_transition = new short[numStates][];
        for (int i=0; i<numStates; i++) {
            DFA22_transition[i] = DFA.unpackEncodedString(DFA22_transitionS[i]);
        }
    }

    class DFA22 extends DFA {

        public DFA22(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 22;
            this.eot = DFA22_eot;
            this.eof = DFA22_eof;
            this.min = DFA22_min;
            this.max = DFA22_max;
            this.accept = DFA22_accept;
            this.special = DFA22_special;
            this.transition = DFA22_transition;
        }
        public String getDescription() {
            return "()* loopback of 243:20: ( COMMA ! table_ref )*";
        }
    }
    static final String DFA27_eotS =
        "\30\uffff";
    static final String DFA27_eofS =
        "\1\6\27\uffff";
    static final String DFA27_minS =
        "\2\12\1\17\3\0\1\uffff\3\0\2\17\1\uffff\1\17\4\0\2\17\4\0";
    static final String DFA27_maxS =
        "\1\u0085\2\74\3\0\1\uffff\3\0\2\74\1\uffff\1\74\4\0\2\74\4\0";
    static final String DFA27_acceptS =
        "\6\uffff\1\2\5\uffff\1\1\13\uffff";
    static final String DFA27_specialS =
        "\3\uffff\1\4\1\13\1\14\1\uffff\1\5\1\12\1\15\4\uffff\1\3\1\11\1"+
        "\2\1\10\2\uffff\1\1\1\7\1\0\1\6}>";
    static final String[] DFA27_transitionS = {
            "\1\5\1\uffff\1\6\2\uffff\1\4\10\uffff\1\2\1\uffff\1\6\11\uffff"+
            "\2\6\12\uffff\2\6\5\uffff\1\6\4\uffff\1\3\1\uffff\2\6\10\uffff"+
            "\1\1\5\uffff\1\6\1\uffff\1\6\4\uffff\1\6\3\uffff\2\6\4\uffff"+
            "\1\6\3\uffff\2\6\1\uffff\2\6\6\uffff\1\6\2\uffff\1\6\5\uffff"+
            "\1\6\6\uffff\1\6\1\uffff\1\6\2\uffff\3\6",
            "\1\11\4\uffff\1\10\10\uffff\1\2\43\uffff\1\7",
            "\1\13\54\uffff\1\12",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\17\22\uffff\1\15\31\uffff\1\16",
            "\1\21\22\uffff\1\15\31\uffff\1\20",
            "",
            "\1\23\54\uffff\1\22",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\25\22\uffff\1\15\31\uffff\1\24",
            "\1\27\22\uffff\1\15\31\uffff\1\26",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff"
    };

    static final short[] DFA27_eot = DFA.unpackEncodedString(DFA27_eotS);
    static final short[] DFA27_eof = DFA.unpackEncodedString(DFA27_eofS);
    static final char[] DFA27_min = DFA.unpackEncodedStringToUnsignedChars(DFA27_minS);
    static final char[] DFA27_max = DFA.unpackEncodedStringToUnsignedChars(DFA27_maxS);
    static final short[] DFA27_accept = DFA.unpackEncodedString(DFA27_acceptS);
    static final short[] DFA27_special = DFA.unpackEncodedString(DFA27_specialS);
    static final short[][] DFA27_transition;

    static {
        int numStates = DFA27_transitionS.length;
        DFA27_transition = new short[numStates][];
        for (int i=0; i<numStates; i++) {
            DFA27_transition[i] = DFA.unpackEncodedString(DFA27_transitionS[i]);
        }
    }

    class DFA27 extends DFA {

        public DFA27(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 27;
            this.eot = DFA27_eot;
            this.eof = DFA27_eof;
            this.min = DFA27_min;
            this.max = DFA27_max;
            this.accept = DFA27_accept;
            this.special = DFA27_special;
            this.transition = DFA27_transition;
        }
        public String getDescription() {
            return "257:9: ({...}? alias )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA27_22 = input.LA(1);

                         
                        int index27_22 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_22);

                        if ( s>=0 ) return s;
                        break;

                    case 1 : 
                        int LA27_20 = input.LA(1);

                         
                        int index27_20 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_20);

                        if ( s>=0 ) return s;
                        break;

                    case 2 : 
                        int LA27_16 = input.LA(1);

                         
                        int index27_16 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_16);

                        if ( s>=0 ) return s;
                        break;

                    case 3 : 
                        int LA27_14 = input.LA(1);

                         
                        int index27_14 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_14);

                        if ( s>=0 ) return s;
                        break;

                    case 4 : 
                        int LA27_3 = input.LA(1);

                         
                        int index27_3 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_3);

                        if ( s>=0 ) return s;
                        break;

                    case 5 : 
                        int LA27_7 = input.LA(1);

                         
                        int index27_7 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_7);

                        if ( s>=0 ) return s;
                        break;

                    case 6 : 
                        int LA27_23 = input.LA(1);

                         
                        int index27_23 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_23);

                        if ( s>=0 ) return s;
                        break;

                    case 7 : 
                        int LA27_21 = input.LA(1);

                         
                        int index27_21 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_21);

                        if ( s>=0 ) return s;
                        break;

                    case 8 : 
                        int LA27_17 = input.LA(1);

                         
                        int index27_17 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_17);

                        if ( s>=0 ) return s;
                        break;

                    case 9 : 
                        int LA27_15 = input.LA(1);

                         
                        int index27_15 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_15);

                        if ( s>=0 ) return s;
                        break;

                    case 10 : 
                        int LA27_8 = input.LA(1);

                         
                        int index27_8 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_8);

                        if ( s>=0 ) return s;
                        break;

                    case 11 : 
                        int LA27_4 = input.LA(1);

                         
                        int index27_4 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_4);

                        if ( s>=0 ) return s;
                        break;

                    case 12 : 
                        int LA27_5 = input.LA(1);

                         
                        int index27_5 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_5);

                        if ( s>=0 ) return s;
                        break;

                    case 13 : 
                        int LA27_9 = input.LA(1);

                         
                        int index27_9 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((isTableAlias())) ) {s = 12;}

                        else if ( (true) ) {s = 6;}

                         
                        input.seek(index27_9);

                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}

            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 27, _s, input);
            error(nvae);
            throw nvae;
        }

    }
    static final String DFA72_eotS =
        "\15\uffff";
    static final String DFA72_eofS =
        "\15\uffff";
    static final String DFA72_minS =
        "\1\74\2\17\2\74\1\uffff\2\17\2\uffff\3\17";
    static final String DFA72_maxS =
        "\1\74\1\115\1\74\2\156\1\uffff\2\74\2\uffff\3\74";
    static final String DFA72_acceptS =
        "\5\uffff\1\2\2\uffff\1\2\1\1\3\uffff";
    static final String DFA72_specialS =
        "\1\5\1\11\1\2\1\3\1\1\1\uffff\1\4\1\7\2\uffff\1\0\1\10\1\6}>";
    static final String[] DFA72_transitionS = {
            "\1\1",
            "\1\4\10\uffff\1\2\43\uffff\1\3\20\uffff\1\5",
            "\1\7\54\uffff\1\6",
            "\1\10\61\uffff\1\11",
            "\1\10\61\uffff\1\11",
            "",
            "\1\4\22\uffff\1\12\31\uffff\1\3",
            "\1\4\22\uffff\1\12\31\uffff\1\3",
            "",
            "",
            "\1\14\54\uffff\1\13",
            "\1\4\22\uffff\1\12\31\uffff\1\3",
            "\1\4\22\uffff\1\12\31\uffff\1\3"
    };

    static final short[] DFA72_eot = DFA.unpackEncodedString(DFA72_eotS);
    static final short[] DFA72_eof = DFA.unpackEncodedString(DFA72_eofS);
    static final char[] DFA72_min = DFA.unpackEncodedStringToUnsignedChars(DFA72_minS);
    static final char[] DFA72_max = DFA.unpackEncodedStringToUnsignedChars(DFA72_maxS);
    static final short[] DFA72_accept = DFA.unpackEncodedString(DFA72_acceptS);
    static final short[] DFA72_special = DFA.unpackEncodedString(DFA72_specialS);
    static final short[][] DFA72_transition;

    static {
        int numStates = DFA72_transitionS.length;
        DFA72_transition = new short[numStates][];
        for (int i=0; i<numStates; i++) {
            DFA72_transition[i] = DFA.unpackEncodedString(DFA72_transitionS[i]);
        }
    }

    class DFA72 extends DFA {

        public DFA72(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 72;
            this.eot = DFA72_eot;
            this.eof = DFA72_eof;
            this.min = DFA72_min;
            this.max = DFA72_max;
            this.accept = DFA72_accept;
            this.special = DFA72_special;
            this.transition = DFA72_transition;
        }
        public String getDescription() {
            return "()* loopback of 427:64: ( reference_model )*";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA72_10 = input.LA(1);

                         
                        int index72_10 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA72_10==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 11;}

                        else if ( (LA72_10==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 12;}

                         
                        input.seek(index72_10);

                        if ( s>=0 ) return s;
                        break;

                    case 1 : 
                        int LA72_4 = input.LA(1);

                         
                        int index72_4 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA72_4==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("main")))) {s = 8;}

                        else if ( (LA72_4==SQL92_RESERVED_ON) && ((input.LT(1).getText().equalsIgnoreCase("reference")))) {s = 9;}

                         
                        input.seek(index72_4);

                        if ( s>=0 ) return s;
                        break;

                    case 2 : 
                        int LA72_2 = input.LA(1);

                         
                        int index72_2 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA72_2==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 6;}

                        else if ( (LA72_2==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 7;}

                         
                        input.seek(index72_2);

                        if ( s>=0 ) return s;
                        break;

                    case 3 : 
                        int LA72_3 = input.LA(1);

                         
                        int index72_3 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA72_3==REGULAR_ID) && ((input.LT(1).getText().equalsIgnoreCase("main")))) {s = 8;}

                        else if ( (LA72_3==SQL92_RESERVED_ON) && ((input.LT(1).getText().equalsIgnoreCase("reference")))) {s = 9;}

                         
                        input.seek(index72_3);

                        if ( s>=0 ) return s;
                        break;

                    case 4 : 
                        int LA72_6 = input.LA(1);

                         
                        int index72_6 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA72_6==PERIOD) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 10;}

                        else if ( (LA72_6==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 3;}

                        else if ( (LA72_6==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 4;}

                         
                        input.seek(index72_6);

                        if ( s>=0 ) return s;
                        break;

                    case 5 : 
                        int LA72_0 = input.LA(1);

                         
                        int index72_0 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA72_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("dimension"))||(input.LT(1).getText().equalsIgnoreCase("main"))||(input.LT(1).getText().equalsIgnoreCase("partition"))))) {s = 1;}

                         
                        input.seek(index72_0);

                        if ( s>=0 ) return s;
                        break;

                    case 6 : 
                        int LA72_12 = input.LA(1);

                         
                        int index72_12 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA72_12==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 3;}

                        else if ( (LA72_12==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 4;}

                        else if ( (LA72_12==PERIOD) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 10;}

                         
                        input.seek(index72_12);

                        if ( s>=0 ) return s;
                        break;

                    case 7 : 
                        int LA72_7 = input.LA(1);

                         
                        int index72_7 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA72_7==PERIOD) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 10;}

                        else if ( (LA72_7==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 3;}

                        else if ( (LA72_7==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 4;}

                         
                        input.seek(index72_7);

                        if ( s>=0 ) return s;
                        break;

                    case 8 : 
                        int LA72_11 = input.LA(1);

                         
                        int index72_11 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA72_11==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 3;}

                        else if ( (LA72_11==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 4;}

                        else if ( (LA72_11==PERIOD) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 10;}

                         
                        input.seek(index72_11);

                        if ( s>=0 ) return s;
                        break;

                    case 9 : 
                        int LA72_1 = input.LA(1);

                         
                        int index72_1 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA72_1==INTRODUCER) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 2;}

                        else if ( (LA72_1==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 3;}

                        else if ( (LA72_1==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("reference"))||(input.LT(1).getText().equalsIgnoreCase("main"))))) {s = 4;}

                        else if ( (LA72_1==SQL92_RESERVED_BY) && (((input.LT(1).getText().equalsIgnoreCase("dimension"))||(input.LT(1).getText().equalsIgnoreCase("partition"))))) {s = 5;}

                         
                        input.seek(index72_1);

                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}

            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 72, _s, input);
            error(nvae);
            throw nvae;
        }

    }
    static final String DFA130_eotS =
        "\21\uffff";
    static final String DFA130_eofS =
        "\1\2\20\uffff";
    static final String DFA130_minS =
        "\1\17\1\5\1\uffff\2\5\1\17\1\10\2\17\1\22\2\17\1\uffff\1\17\1\22"+
        "\2\17";
    static final String DFA130_maxS =
        "\1\u0085\1\u0087\1\uffff\2\u0087\1\172\1\110\1\74\1\137\3\74\1\uffff"+
        "\4\74";
    static final String DFA130_acceptS =
        "\2\uffff\1\2\11\uffff\1\1\4\uffff";
    static final String DFA130_specialS =
        "\21\uffff}>";
    static final String[] DFA130_transitionS = {
            "\1\2\12\uffff\1\2\25\uffff\1\2\13\uffff\1\2\2\uffff\1\2\16\uffff"+
            "\1\2\6\uffff\1\2\3\uffff\2\2\13\uffff\1\2\20\uffff\1\2\10\uffff"+
            "\1\2\2\uffff\1\1\1\uffff\1\2",
            "\1\2\4\uffff\2\2\3\uffff\1\2\3\uffff\1\2\4\uffff\1\2\1\uffff"+
            "\1\2\2\uffff\1\2\34\uffff\1\2\1\uffff\1\3\7\uffff\1\2\2\uffff"+
            "\1\2\6\uffff\1\2\5\uffff\1\2\2\uffff\1\2\4\uffff\2\2\15\uffff"+
            "\2\2\6\uffff\1\2\11\uffff\1\2\11\uffff\1\2",
            "",
            "\1\2\1\uffff\1\2\2\uffff\2\2\2\uffff\2\2\2\uffff\2\2\1\uffff"+
            "\2\2\1\uffff\6\2\2\uffff\1\2\1\uffff\1\2\27\uffff\1\2\1\uffff"+
            "\1\2\5\uffff\1\2\1\uffff\1\2\1\uffff\2\2\4\uffff\1\2\1\uffff"+
            "\1\2\5\uffff\1\2\2\uffff\1\2\4\uffff\2\2\7\uffff\1\2\3\uffff"+
            "\4\2\3\uffff\1\2\2\uffff\1\2\7\uffff\1\4\1\uffff\1\2\11\uffff"+
            "\1\2",
            "\1\2\4\uffff\2\2\3\uffff\1\2\3\uffff\1\2\4\uffff\1\2\1\uffff"+
            "\1\2\2\uffff\1\2\22\uffff\1\2\11\uffff\1\2\1\uffff\1\2\7\uffff"+
            "\1\2\2\uffff\1\2\6\uffff\1\2\5\uffff\2\2\1\uffff\1\2\4\uffff"+
            "\2\2\10\uffff\1\2\4\uffff\2\2\6\uffff\1\2\3\uffff\1\2\5\uffff"+
            "\1\2\2\uffff\1\5\4\uffff\1\2\1\uffff\1\2",
            "\1\2\10\uffff\1\2\1\uffff\1\2\41\uffff\1\6\75\uffff\1\2",
            "\1\2\1\uffff\1\2\4\uffff\1\11\10\uffff\1\7\1\uffff\1\2\7\uffff"+
            "\1\2\31\uffff\1\10\13\uffff\1\2",
            "\1\13\54\uffff\1\12",
            "\1\2\2\uffff\1\14\5\uffff\1\2\1\uffff\1\2\7\uffff\1\14\31\uffff"+
            "\1\2\42\uffff\1\2",
            "\1\14\17\uffff\1\14\31\uffff\1\2",
            "\1\11\22\uffff\1\15\31\uffff\1\16",
            "\1\11\22\uffff\1\15\31\uffff\1\16",
            "",
            "\1\20\54\uffff\1\17",
            "\1\14\17\uffff\1\14\31\uffff\1\2",
            "\1\11\22\uffff\1\15\31\uffff\1\16",
            "\1\11\22\uffff\1\15\31\uffff\1\16"
    };

    static final short[] DFA130_eot = DFA.unpackEncodedString(DFA130_eotS);
    static final short[] DFA130_eof = DFA.unpackEncodedString(DFA130_eofS);
    static final char[] DFA130_min = DFA.unpackEncodedStringToUnsignedChars(DFA130_minS);
    static final char[] DFA130_max = DFA.unpackEncodedStringToUnsignedChars(DFA130_maxS);
    static final short[] DFA130_accept = DFA.unpackEncodedString(DFA130_acceptS);
    static final short[] DFA130_special = DFA.unpackEncodedString(DFA130_specialS);
    static final short[][] DFA130_transition;

    static {
        int numStates = DFA130_transitionS.length;
        DFA130_transition = new short[numStates][];
        for (int i=0; i<numStates; i++) {
            DFA130_transition[i] = DFA.unpackEncodedString(DFA130_transitionS[i]);
        }
    }

    class DFA130 extends DFA {

        public DFA130(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 130;
            this.eot = DFA130_eot;
            this.eof = DFA130_eof;
            this.min = DFA130_min;
            this.max = DFA130_max;
            this.accept = DFA130_accept;
            this.special = DFA130_special;
            this.transition = DFA130_transition;
        }
        public String getDescription() {
            return "621:9: ( merge_update_clause )?";
        }
    }
    static final String DFA151_eotS =
        "\14\uffff";
    static final String DFA151_eofS =
        "\1\2\13\uffff";
    static final String DFA151_minS =
        "\1\5\1\17\1\uffff\1\17\2\uffff\3\17\1\uffff\2\17";
    static final String DFA151_maxS =
        "\1\u0087\1\172\1\uffff\1\74\2\uffff\3\74\1\uffff\2\74";
    static final String DFA151_acceptS =
        "\2\uffff\1\2\1\uffff\2\1\3\uffff\1\1\2\uffff";
    static final String DFA151_specialS =
        "\14\uffff}>";
    static final String[] DFA151_transitionS = {
            "\1\2\4\uffff\2\2\3\uffff\1\2\3\uffff\1\2\4\uffff\1\2\1\uffff"+
            "\1\2\2\uffff\1\2\22\uffff\1\2\11\uffff\1\2\1\uffff\1\2\2\uffff"+
            "\1\2\4\uffff\1\2\2\uffff\1\2\6\uffff\1\2\5\uffff\2\2\1\uffff"+
            "\1\2\1\uffff\2\2\1\uffff\2\2\10\uffff\1\2\1\uffff\1\1\2\uffff"+
            "\2\2\6\uffff\1\2\3\uffff\1\2\5\uffff\1\2\2\uffff\1\2\2\uffff"+
            "\1\2\1\uffff\1\2\1\uffff\1\2",
            "\1\5\10\uffff\1\3\1\uffff\1\2\41\uffff\1\4\75\uffff\1\2",
            "",
            "\1\7\54\uffff\1\6",
            "",
            "",
            "\1\5\22\uffff\1\10\31\uffff\1\11",
            "\1\5\22\uffff\1\10\31\uffff\1\11",
            "\1\13\54\uffff\1\12",
            "",
            "\1\5\22\uffff\1\10\31\uffff\1\11",
            "\1\5\22\uffff\1\10\31\uffff\1\11"
    };

    static final short[] DFA151_eot = DFA.unpackEncodedString(DFA151_eotS);
    static final short[] DFA151_eof = DFA.unpackEncodedString(DFA151_eofS);
    static final char[] DFA151_min = DFA.unpackEncodedStringToUnsignedChars(DFA151_minS);
    static final char[] DFA151_max = DFA.unpackEncodedStringToUnsignedChars(DFA151_maxS);
    static final short[] DFA151_accept = DFA.unpackEncodedString(DFA151_acceptS);
    static final short[] DFA151_special = DFA.unpackEncodedString(DFA151_specialS);
    static final short[][] DFA151_transition;

    static {
        int numStates = DFA151_transitionS.length;
        DFA151_transition = new short[numStates][];
        for (int i=0; i<numStates; i++) {
            DFA151_transition[i] = DFA.unpackEncodedString(DFA151_transitionS[i]);
        }
    }

    class DFA151 extends DFA {

        public DFA151(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 151;
            this.eot = DFA151_eot;
            this.eof = DFA151_eof;
            this.min = DFA151_min;
            this.max = DFA151_max;
            this.accept = DFA151_accept;
            this.special = DFA151_special;
            this.transition = DFA151_transition;
        }
        public String getDescription() {
            return "703:9: ( error_logging_into_part )?";
        }
    }
    static final String DFA193_eotS =
        "\76\uffff";
    static final String DFA193_eofS =
        "\1\2\75\uffff";
    static final String DFA193_minS =
        "\1\7\75\uffff";
    static final String DFA193_maxS =
        "\1\u0085\75\uffff";
    static final String DFA193_acceptS =
        "\1\uffff\1\1\1\2\73\uffff";
    static final String DFA193_specialS =
        "\76\uffff}>";
    static final String[] DFA193_transitionS = {
            "\1\2\2\uffff\1\2\1\uffff\1\2\1\uffff\2\2\2\uffff\1\2\2\uffff"+
            "\2\2\1\uffff\2\2\1\1\3\2\2\uffff\1\2\3\uffff\2\2\2\uffff\1\2"+
            "\7\uffff\2\2\5\uffff\1\2\2\uffff\1\2\1\uffff\4\2\2\uffff\1\2"+
            "\3\uffff\1\2\1\uffff\2\2\2\uffff\1\2\1\uffff\1\2\1\uffff\1\2"+
            "\3\uffff\3\2\2\uffff\2\2\4\uffff\2\2\2\uffff\11\2\2\uffff\1"+
            "\2\1\uffff\2\2\5\uffff\1\2\3\uffff\2\2\1\uffff\1\2\1\uffff\1"+
            "\2\2\uffff\3\2",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] DFA193_eot = DFA.unpackEncodedString(DFA193_eotS);
    static final short[] DFA193_eof = DFA.unpackEncodedString(DFA193_eofS);
    static final char[] DFA193_min = DFA.unpackEncodedStringToUnsignedChars(DFA193_minS);
    static final char[] DFA193_max = DFA.unpackEncodedStringToUnsignedChars(DFA193_maxS);
    static final short[] DFA193_accept = DFA.unpackEncodedString(DFA193_acceptS);
    static final short[] DFA193_special = DFA.unpackEncodedString(DFA193_specialS);
    static final short[][] DFA193_transition;

    static {
        int numStates = DFA193_transitionS.length;
        DFA193_transition = new short[numStates][];
        for (int i=0; i<numStates; i++) {
            DFA193_transition[i] = DFA.unpackEncodedString(DFA193_transitionS[i]);
        }
    }

    class DFA193 extends DFA {

        public DFA193(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 193;
            this.eot = DFA193_eot;
            this.eof = DFA193_eof;
            this.min = DFA193_min;
            this.max = DFA193_max;
            this.accept = DFA193_accept;
            this.special = DFA193_special;
            this.transition = DFA193_transition;
        }
        public String getDescription() {
            return "900:91: ( LEFT_PAREN cn2= concatenation_wrapper RIGHT_PAREN )?";
        }
    }
    static final String DFA232_eotS =
        "\76\uffff";
    static final String DFA232_eofS =
        "\1\2\75\uffff";
    static final String DFA232_minS =
        "\1\7\75\uffff";
    static final String DFA232_maxS =
        "\1\u0085\75\uffff";
    static final String DFA232_acceptS =
        "\1\uffff\1\1\1\2\73\uffff";
    static final String DFA232_specialS =
        "\76\uffff}>";
    static final String[] DFA232_transitionS = {
            "\1\2\2\uffff\1\2\1\uffff\1\2\1\uffff\2\2\2\uffff\1\2\2\uffff"+
            "\2\2\1\uffff\6\2\2\uffff\1\2\3\uffff\1\2\1\1\2\uffff\1\2\7\uffff"+
            "\2\2\5\uffff\1\2\2\uffff\1\2\1\uffff\4\2\2\uffff\1\2\3\uffff"+
            "\1\2\1\uffff\2\2\2\uffff\1\2\1\uffff\1\2\1\uffff\1\2\3\uffff"+
            "\3\2\2\uffff\2\2\4\uffff\2\2\2\uffff\11\2\2\uffff\1\2\1\uffff"+
            "\2\2\5\uffff\1\2\3\uffff\2\2\1\uffff\1\2\1\uffff\1\2\2\uffff"+
            "\3\2",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] DFA232_eot = DFA.unpackEncodedString(DFA232_eotS);
    static final short[] DFA232_eof = DFA.unpackEncodedString(DFA232_eofS);
    static final char[] DFA232_min = DFA.unpackEncodedStringToUnsignedChars(DFA232_minS);
    static final char[] DFA232_max = DFA.unpackEncodedStringToUnsignedChars(DFA232_maxS);
    static final short[] DFA232_accept = DFA.unpackEncodedString(DFA232_acceptS);
    static final short[] DFA232_special = DFA.unpackEncodedString(DFA232_specialS);
    static final short[][] DFA232_transition;

    static {
        int numStates = DFA232_transitionS.length;
        DFA232_transition = new short[numStates][];
        for (int i=0; i<numStates; i++) {
            DFA232_transition[i] = DFA.unpackEncodedString(DFA232_transitionS[i]);
        }
    }

    class DFA232 extends DFA {

        public DFA232(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 232;
            this.eot = DFA232_eot;
            this.eof = DFA232_eof;
            this.min = DFA232_min;
            this.max = DFA232_max;
            this.accept = DFA232_accept;
            this.special = DFA232_special;
            this.transition = DFA232_transition;
        }
        public String getDescription() {
            return "1036:62: ( using_clause )?";
        }
    }
    static final String DFA263_eotS =
        "\16\uffff";
    static final String DFA263_eofS =
        "\16\uffff";
    static final String DFA263_minS =
        "\1\74\1\5\1\17\2\0\1\uffff\2\13\1\uffff\1\17\2\0\2\13";
    static final String DFA263_maxS =
        "\1\74\1\u0087\1\74\2\0\1\uffff\2\74\1\uffff\1\74\2\0\2\74";
    static final String DFA263_acceptS =
        "\5\uffff\1\2\2\uffff\1\1\5\uffff";
    static final String DFA263_specialS =
        "\1\3\1\10\1\1\1\0\1\11\1\uffff\1\7\1\12\1\uffff\1\2\1\5\1\4\1\13"+
        "\1\6}>";
    static final String[] DFA263_transitionS = {
            "\1\1",
            "\1\5\4\uffff\2\5\3\uffff\1\4\3\uffff\1\5\4\uffff\1\2\1\uffff"+
            "\1\5\2\uffff\1\5\34\uffff\1\5\1\uffff\1\3\7\uffff\1\5\2\uffff"+
            "\1\5\6\uffff\1\5\5\uffff\1\5\2\uffff\1\5\4\uffff\2\5\16\uffff"+
            "\1\5\6\uffff\1\5\11\uffff\1\5\11\uffff\1\5",
            "\1\7\54\uffff\1\6",
            "\1\uffff",
            "\1\uffff",
            "",
            "\1\5\3\uffff\1\13\22\uffff\1\11\31\uffff\1\12",
            "\1\5\3\uffff\1\13\22\uffff\1\11\31\uffff\1\12",
            "",
            "\1\15\54\uffff\1\14",
            "\1\uffff",
            "\1\uffff",
            "\1\5\3\uffff\1\13\22\uffff\1\11\31\uffff\1\12",
            "\1\5\3\uffff\1\13\22\uffff\1\11\31\uffff\1\12"
    };

    static final short[] DFA263_eot = DFA.unpackEncodedString(DFA263_eotS);
    static final short[] DFA263_eof = DFA.unpackEncodedString(DFA263_eofS);
    static final char[] DFA263_min = DFA.unpackEncodedStringToUnsignedChars(DFA263_minS);
    static final char[] DFA263_max = DFA.unpackEncodedStringToUnsignedChars(DFA263_maxS);
    static final short[] DFA263_accept = DFA.unpackEncodedString(DFA263_acceptS);
    static final short[] DFA263_special = DFA.unpackEncodedString(DFA263_specialS);
    static final short[][] DFA263_transition;

    static {
        int numStates = DFA263_transitionS.length;
        DFA263_transition = new short[numStates][];
        for (int i=0; i<numStates; i++) {
            DFA263_transition[i] = DFA.unpackEncodedString(DFA263_transitionS[i]);
        }
    }

    class DFA263 extends DFA {

        public DFA263(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 263;
            this.eot = DFA263_eot;
            this.eof = DFA263_eof;
            this.min = DFA263_min;
            this.max = DFA263_max;
            this.accept = DFA263_accept;
            this.special = DFA263_special;
            this.transition = DFA263_transition;
        }
        public String getDescription() {
            return "1110:17: ( name_key id | evalname_key concatenation_wrapper )";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA263_3 = input.LA(1);

                         
                        int index263_3 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((input.LT(1).getText().equalsIgnoreCase("name"))) ) {s = 8;}

                        else if ( ((input.LT(1).getText().equalsIgnoreCase("evalname"))) ) {s = 5;}

                         
                        input.seek(index263_3);

                        if ( s>=0 ) return s;
                        break;

                    case 1 : 
                        int LA263_2 = input.LA(1);

                         
                        int index263_2 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA263_2==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 6;}

                        else if ( (LA263_2==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 7;}

                         
                        input.seek(index263_2);

                        if ( s>=0 ) return s;
                        break;

                    case 2 : 
                        int LA263_9 = input.LA(1);

                         
                        int index263_9 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA263_9==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 12;}

                        else if ( (LA263_9==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 13;}

                         
                        input.seek(index263_9);

                        if ( s>=0 ) return s;
                        break;

                    case 3 : 
                        int LA263_0 = input.LA(1);

                         
                        int index263_0 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA263_0==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 1;}

                         
                        input.seek(index263_0);

                        if ( s>=0 ) return s;
                        break;

                    case 4 : 
                        int LA263_11 = input.LA(1);

                         
                        int index263_11 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((input.LT(1).getText().equalsIgnoreCase("name"))) ) {s = 8;}

                        else if ( ((input.LT(1).getText().equalsIgnoreCase("evalname"))) ) {s = 5;}

                         
                        input.seek(index263_11);

                        if ( s>=0 ) return s;
                        break;

                    case 5 : 
                        int LA263_10 = input.LA(1);

                         
                        int index263_10 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((input.LT(1).getText().equalsIgnoreCase("name"))) ) {s = 8;}

                        else if ( ((input.LT(1).getText().equalsIgnoreCase("evalname"))) ) {s = 5;}

                         
                        input.seek(index263_10);

                        if ( s>=0 ) return s;
                        break;

                    case 6 : 
                        int LA263_13 = input.LA(1);

                         
                        int index263_13 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA263_13==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 10;}

                        else if ( (LA263_13==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 11;}

                        else if ( (LA263_13==PERIOD) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 9;}

                        else if ( (LA263_13==COLON) && ((input.LT(1).getText().equalsIgnoreCase("evalname")))) {s = 5;}

                         
                        input.seek(index263_13);

                        if ( s>=0 ) return s;
                        break;

                    case 7 : 
                        int LA263_6 = input.LA(1);

                         
                        int index263_6 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA263_6==PERIOD) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 9;}

                        else if ( (LA263_6==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 10;}

                        else if ( (LA263_6==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 11;}

                        else if ( (LA263_6==COLON) && ((input.LT(1).getText().equalsIgnoreCase("evalname")))) {s = 5;}

                         
                        input.seek(index263_6);

                        if ( s>=0 ) return s;
                        break;

                    case 8 : 
                        int LA263_1 = input.LA(1);

                         
                        int index263_1 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA263_1==INTRODUCER) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 2;}

                        else if ( (LA263_1==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 3;}

                        else if ( (LA263_1==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 4;}

                        else if ( (LA263_1==APPROXIMATE_NUM_LIT||(LA263_1 >= CHAR_STRING && LA263_1 <= COLON)||LA263_1==EXACT_NUM_LIT||LA263_1==LEFT_PAREN||LA263_1==MINUS_SIGN||LA263_1==PLUS_SIGN||LA263_1==SQL92_RESERVED_ALL||LA263_1==SQL92_RESERVED_ANY||LA263_1==SQL92_RESERVED_CASE||LA263_1==SQL92_RESERVED_DEFAULT||LA263_1==SQL92_RESERVED_DISTINCT||(LA263_1 >= SQL92_RESERVED_EXISTS && LA263_1 <= SQL92_RESERVED_FALSE)||LA263_1==SQL92_RESERVED_NULL||LA263_1==SQL92_RESERVED_PRIOR||LA263_1==SQL92_RESERVED_TRUE||LA263_1==UNSIGNED_INTEGER) && ((input.LT(1).getText().equalsIgnoreCase("evalname")))) {s = 5;}

                         
                        input.seek(index263_1);

                        if ( s>=0 ) return s;
                        break;

                    case 9 : 
                        int LA263_4 = input.LA(1);

                         
                        int index263_4 = input.index();
                        input.rewind();

                        s = -1;
                        if ( ((input.LT(1).getText().equalsIgnoreCase("name"))) ) {s = 8;}

                        else if ( ((input.LT(1).getText().equalsIgnoreCase("evalname"))) ) {s = 5;}

                         
                        input.seek(index263_4);

                        if ( s>=0 ) return s;
                        break;

                    case 10 : 
                        int LA263_7 = input.LA(1);

                         
                        int index263_7 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA263_7==PERIOD) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 9;}

                        else if ( (LA263_7==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 10;}

                        else if ( (LA263_7==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 11;}

                        else if ( (LA263_7==COLON) && ((input.LT(1).getText().equalsIgnoreCase("evalname")))) {s = 5;}

                         
                        input.seek(index263_7);

                        if ( s>=0 ) return s;
                        break;

                    case 11 : 
                        int LA263_12 = input.LA(1);

                         
                        int index263_12 = input.index();
                        input.rewind();

                        s = -1;
                        if ( (LA263_12==REGULAR_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 10;}

                        else if ( (LA263_12==DELIMITED_ID) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 11;}

                        else if ( (LA263_12==PERIOD) && (((input.LT(1).getText().equalsIgnoreCase("evalname"))||(input.LT(1).getText().equalsIgnoreCase("name"))))) {s = 9;}

                        else if ( (LA263_12==COLON) && ((input.LT(1).getText().equalsIgnoreCase("evalname")))) {s = 5;}

                         
                        input.seek(index263_12);

                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}

            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 263, _s, input);
            error(nvae);
            throw nvae;
        }

    }
 

    public static final BitSet FOLLOW_seq_of_statements_in_compilation_unit578 = new BitSet(new long[]{0x1001000004008000L,0x0080004000204000L,0x0000000000000021L});
    public static final BitSet FOLLOW_EOF_in_compilation_unit581 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_select_statement_in_seq_of_statements602 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_update_statement_in_seq_of_statements613 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_delete_statement_in_seq_of_statements624 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_insert_statement_in_seq_of_statements635 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_lock_table_statement_in_seq_of_statements646 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_merge_statement_in_seq_of_statements657 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_case_statement_in_seq_of_statements668 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_subquery_factoring_clause_in_select_statement689 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000000L});
    public static final BitSet FOLLOW_subquery_in_select_statement700 = new BitSet(new long[]{0x0000000000000002L,0x0002000080000000L});
    public static final BitSet FOLLOW_for_update_clause_in_select_statement711 = new BitSet(new long[]{0x0000000000000002L,0x0002000080000000L});
    public static final BitSet FOLLOW_order_by_clause_in_select_statement723 = new BitSet(new long[]{0x0000000000000002L,0x0002000080000000L});
    public static final BitSet FOLLOW_with_key_in_subquery_factoring_clause773 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_factoring_element_in_subquery_factoring_clause776 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_COMMA_in_subquery_factoring_clause779 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_factoring_element_in_subquery_factoring_clause782 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_query_name_in_factoring_element804 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000100L});
    public static final BitSet FOLLOW_as_key_in_factoring_element806 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_factoring_element808 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000000L});
    public static final BitSet FOLLOW_subquery_in_factoring_element810 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_factoring_element812 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_subquery_basic_elements_in_subquery850 = new BitSet(new long[]{0x0002000000000002L,0x4000008000000000L});
    public static final BitSet FOLLOW_subquery_operation_part_in_subquery852 = new BitSet(new long[]{0x0002000000000002L,0x4000008000000000L});
    public static final BitSet FOLLOW_union_key_in_subquery_operation_part893 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000010L});
    public static final BitSet FOLLOW_all_key_in_subquery_operation_part896 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000000L});
    public static final BitSet FOLLOW_intersect_key_in_subquery_operation_part899 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000000L});
    public static final BitSet FOLLOW_minus_key_in_subquery_operation_part902 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000000L});
    public static final BitSet FOLLOW_subquery_basic_elements_in_subquery_operation_part906 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_query_block_in_subquery_basic_elements926 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_subquery_basic_elements937 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000000L});
    public static final BitSet FOLLOW_subquery_in_subquery_basic_elements940 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_subquery_basic_elements942 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_select_key_in_query_block971 = new BitSet(new long[]{0x1400000025088CA0L,0xA008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_distinct_key_in_query_block992 = new BitSet(new long[]{0x1400000025088CA0L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_unique_key_in_query_block994 = new BitSet(new long[]{0x1400000025088CA0L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_all_key_in_query_block996 = new BitSet(new long[]{0x1400000025088CA0L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_ASTERISK_in_query_block1010 = new BitSet(new long[]{0x1000000000000000L,0x0000010100000000L});
    public static final BitSet FOLLOW_selected_element_in_query_block1015 = new BitSet(new long[]{0x1000000000001000L,0x0000010100000000L});
    public static final BitSet FOLLOW_COMMA_in_query_block1018 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_selected_element_in_query_block1020 = new BitSet(new long[]{0x1000000000001000L,0x0000010100000000L});
    public static final BitSet FOLLOW_into_clause_in_query_block1033 = new BitSet(new long[]{0x0000000000000000L,0x0000000100000000L});
    public static final BitSet FOLLOW_from_clause_in_query_block1044 = new BitSet(new long[]{0x0080001000000002L,0x0000001800010000L,0x0000000000000010L});
    public static final BitSet FOLLOW_where_clause_in_query_block1055 = new BitSet(new long[]{0x0080001000000002L,0x0000001800010000L});
    public static final BitSet FOLLOW_hierarchical_query_clause_in_query_block1067 = new BitSet(new long[]{0x0000001000000002L,0x0000001800000000L});
    public static final BitSet FOLLOW_group_by_clause_in_query_block1079 = new BitSet(new long[]{0x0000001000000002L,0x0000001000000000L});
    public static final BitSet FOLLOW_having_clause_in_query_block1090 = new BitSet(new long[]{0x0000001000000002L});
    public static final BitSet FOLLOW_model_clause_in_query_block1102 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_select_list_elements_in_selected_element1254 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_selected_element1256 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_from_key_in_from_clause1296 = new BitSet(new long[]{0x1000000005008000L,0x0400000000000000L});
    public static final BitSet FOLLOW_table_ref_list_in_from_clause1299 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_tableview_name_in_select_list_elements1328 = new BitSet(new long[]{0x0000000400000000L});
    public static final BitSet FOLLOW_PERIOD_in_select_list_elements1330 = new BitSet(new long[]{0x0000000000000080L});
    public static final BitSet FOLLOW_ASTERISK_in_select_list_elements1332 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_in_select_list_elements1358 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_table_ref_in_table_ref_list1386 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_COMMA_in_table_ref_list1389 = new BitSet(new long[]{0x1000000005008000L,0x0400000000000000L});
    public static final BitSet FOLLOW_table_ref_in_table_ref_list1392 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_table_ref_aux_in_table_ref1414 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_join_clause_in_table_ref1416 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_dml_table_expression_clause_in_table_ref_aux1462 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_pivot_clause_in_table_ref_aux1465 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_unpivot_clause_in_table_ref_aux1467 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_only_key_in_table_ref_aux1480 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_table_ref_aux1482 = new BitSet(new long[]{0x1000000005008000L,0x0400000000000000L});
    public static final BitSet FOLLOW_dml_table_expression_clause_in_table_ref_aux1484 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_table_ref_aux1486 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_flashback_query_clause_in_table_ref_aux1502 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_table_ref_aux1516 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_query_partition_clause_in_join_clause1569 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_cross_key_in_join_clause1581 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_natural_key_in_join_clause1583 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_inner_key_in_join_clause1588 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_outer_join_type_in_join_clause1590 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_join_key_in_join_clause1594 = new BitSet(new long[]{0x1000000005008000L,0x0400000000000000L});
    public static final BitSet FOLLOW_table_ref_aux_in_join_clause1604 = new BitSet(new long[]{0x1000002000000002L,0x0000400000000000L});
    public static final BitSet FOLLOW_query_partition_clause_in_join_clause1614 = new BitSet(new long[]{0x0000002000000002L,0x0000400000000000L});
    public static final BitSet FOLLOW_join_on_part_in_join_clause1626 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_join_using_part_in_join_clause1637 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_on_key_in_join_on_part1703 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_condition_in_join_on_part1705 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_using_key_in_join_using_part1746 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_join_using_part1749 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_join_using_part1752 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_join_using_part1755 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_join_using_part1758 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_join_using_part1762 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_full_key_in_outer_join_type1793 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_left_key_in_outer_join_type1804 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_right_key_in_outer_join_type1815 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_outer_key_in_outer_join_type1831 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_partition_key_in_query_partition_clause1853 = new BitSet(new long[]{0x0000000000000000L,0x0000000000002000L});
    public static final BitSet FOLLOW_by_key_in_query_partition_clause1855 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_list_in_query_partition_clause1871 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_in_query_partition_clause1882 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_COMMA_in_query_partition_clause1885 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_query_partition_clause1887 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_versions_key_in_flashback_query_clause1939 = new BitSet(new long[]{0x0000000000000000L,0x0000000000001000L});
    public static final BitSet FOLLOW_between_key_in_flashback_query_clause1941 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_scn_key_in_flashback_query_clause1944 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_timestamp_key_in_flashback_query_clause1946 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_flashback_query_clause1949 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_as_key_in_flashback_query_clause1979 = new BitSet(new long[]{0x0000000000000000L,0x0000200000000000L});
    public static final BitSet FOLLOW_of_key_in_flashback_query_clause1981 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_scn_key_in_flashback_query_clause1984 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_timestamp_key_in_flashback_query_clause1986 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_flashback_query_clause1989 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_pivot_key_in_pivot_clause2027 = new BitSet(new long[]{0x1000000004000000L});
    public static final BitSet FOLLOW_xml_key_in_pivot_clause2029 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_pivot_clause2040 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_pivot_element_in_pivot_clause2054 = new BitSet(new long[]{0x0000000000001000L,0x0000000080000000L});
    public static final BitSet FOLLOW_COMMA_in_pivot_clause2057 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_pivot_element_in_pivot_clause2059 = new BitSet(new long[]{0x0000000000001000L,0x0000000080000000L});
    public static final BitSet FOLLOW_pivot_for_clause_in_pivot_clause2075 = new BitSet(new long[]{0x0000000000000000L,0x0000002000000000L});
    public static final BitSet FOLLOW_pivot_in_clause_in_pivot_clause2089 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_pivot_clause2101 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_aggregate_function_name_in_pivot_element2145 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_pivot_element2147 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_pivot_element2149 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_pivot_element2151 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_pivot_element2153 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_for_key_in_pivot_for_clause2215 = new BitSet(new long[]{0x1000000005008000L});
    public static final BitSet FOLLOW_column_name_in_pivot_for_clause2227 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_pivot_for_clause2238 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_pivot_for_clause2240 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_pivot_for_clause2243 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_pivot_for_clause2245 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_pivot_for_clause2249 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_in_key_in_pivot_in_clause2300 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_pivot_in_clause2310 = new BitSet(new long[]{0x1400000025088C20L,0x2088180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_subquery_in_pivot_in_clause2334 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_any_key_in_pivot_in_clause2360 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_pivot_in_clause2363 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000080L});
    public static final BitSet FOLLOW_any_key_in_pivot_in_clause2365 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_pivot_in_clause_element_in_pivot_in_clause2388 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_pivot_in_clause2391 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_pivot_in_clause_element_in_pivot_in_clause2393 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_pivot_in_clause2419 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_pivot_in_clause_elements_in_pivot_in_clause_element2499 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_pivot_in_clause_element2501 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_in_pivot_in_clause_elements2541 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_list_in_pivot_in_clause_elements2565 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_unpivot_key_in_unpivot_clause2585 = new BitSet(new long[]{0x1000000004000000L});
    public static final BitSet FOLLOW_include_key_in_unpivot_clause2598 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_exclude_key_in_unpivot_clause2600 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_nulls_key_in_unpivot_clause2603 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_unpivot_clause2615 = new BitSet(new long[]{0x1000000005008000L});
    public static final BitSet FOLLOW_column_name_in_unpivot_clause2634 = new BitSet(new long[]{0x0000000000000000L,0x0000000080000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_unpivot_clause2653 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_unpivot_clause2655 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_unpivot_clause2658 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_unpivot_clause2660 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_unpivot_clause2664 = new BitSet(new long[]{0x0000000000000000L,0x0000000080000000L});
    public static final BitSet FOLLOW_pivot_for_clause_in_unpivot_clause2692 = new BitSet(new long[]{0x0000000000000000L,0x0000002000000000L});
    public static final BitSet FOLLOW_unpivot_in_clause_in_unpivot_clause2706 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_unpivot_clause2716 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_in_key_in_unpivot_in_clause2766 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_unpivot_in_clause2776 = new BitSet(new long[]{0x1000000005008000L});
    public static final BitSet FOLLOW_unpivot_in_elements_in_unpivot_in_clause2790 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_unpivot_in_clause2793 = new BitSet(new long[]{0x1000000005008000L});
    public static final BitSet FOLLOW_unpivot_in_elements_in_unpivot_in_clause2795 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_unpivot_in_clause2807 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_column_name_in_unpivot_in_elements2853 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904190L,0x0000000000000080L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_unpivot_in_elements2868 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_unpivot_in_elements2870 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_unpivot_in_elements2873 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_unpivot_in_elements2875 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_unpivot_in_elements2879 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904190L,0x0000000000000080L});
    public static final BitSet FOLLOW_as_key_in_unpivot_in_elements2899 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_unpivot_in_elements2915 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_list_in_unpivot_in_elements2935 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_connect_key_in_hierarchical_query_clause2988 = new BitSet(new long[]{0x0000000000000000L,0x0000000000002000L});
    public static final BitSet FOLLOW_by_key_in_hierarchical_query_clause2990 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_nocycle_key_in_hierarchical_query_clause2992 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_condition_in_hierarchical_query_clause2995 = new BitSet(new long[]{0x0080000000000002L});
    public static final BitSet FOLLOW_start_part_in_hierarchical_query_clause2997 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_start_part_in_hierarchical_query_clause3039 = new BitSet(new long[]{0x0000000000000000L,0x0000000000010000L});
    public static final BitSet FOLLOW_connect_key_in_hierarchical_query_clause3041 = new BitSet(new long[]{0x0000000000000000L,0x0000000000002000L});
    public static final BitSet FOLLOW_by_key_in_hierarchical_query_clause3043 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_nocycle_key_in_hierarchical_query_clause3045 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_condition_in_hierarchical_query_clause3048 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_start_key_in_start_part3097 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000020L});
    public static final BitSet FOLLOW_with_key_in_start_part3099 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_condition_in_start_part3101 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_group_key_in_group_by_clause3141 = new BitSet(new long[]{0x0000000000000000L,0x0000000000002000L});
    public static final BitSet FOLLOW_by_key_in_group_by_clause3143 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_group_by_elements_in_group_by_clause3145 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_COMMA_in_group_by_clause3155 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_group_by_elements_in_group_by_clause3157 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_grouping_sets_clause_in_group_by_elements3200 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_rollup_cube_clause_in_group_by_elements3211 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_in_group_by_elements3223 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_rollup_key_in_rollup_cube_clause3252 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_cube_key_in_rollup_cube_clause3255 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_rollup_cube_clause3259 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_grouping_sets_elements_in_rollup_cube_clause3262 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_rollup_cube_clause3265 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_grouping_sets_elements_in_rollup_cube_clause3268 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_rollup_cube_clause3272 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_grouping_key_in_grouping_sets_clause3294 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_sets_key_in_grouping_sets_clause3296 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_grouping_sets_clause3307 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_grouping_sets_elements_in_grouping_sets_clause3309 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_grouping_sets_clause3312 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_grouping_sets_elements_in_grouping_sets_clause3314 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_grouping_sets_clause3318 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_rollup_cube_clause_in_grouping_sets_elements3366 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_list_in_grouping_sets_elements3382 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_in_grouping_sets_elements3393 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_having_key_in_having_clause3421 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_condition_in_having_clause3423 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_model_key_in_model_clause3463 = new BitSet(new long[]{0x1000000000000000L,0x8000000000000000L});
    public static final BitSet FOLLOW_cell_reference_options_in_model_clause3465 = new BitSet(new long[]{0x1000000000000000L,0x8000000000000000L});
    public static final BitSet FOLLOW_return_rows_clause_in_model_clause3468 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_reference_model_in_model_clause3471 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_main_model_in_model_clause3474 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ignore_key_in_cell_reference_options3520 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_keep_key_in_cell_reference_options3523 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_nav_key_in_cell_reference_options3527 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_unique_key_in_cell_reference_options3538 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_dimension_key_in_cell_reference_options3542 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_single_key_in_cell_reference_options3544 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_reference_key_in_cell_reference_options3546 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_return_key_in_return_rows_clause3569 = new BitSet(new long[]{0x1000000000000000L,0x0000000000000010L});
    public static final BitSet FOLLOW_updated_key_in_return_rows_clause3573 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_all_key_in_return_rows_clause3575 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_rows_key_in_return_rows_clause3578 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_reference_key_in_reference_model3599 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_reference_model_name_in_reference_model3602 = new BitSet(new long[]{0x0000000000000000L,0x0000400000000000L});
    public static final BitSet FOLLOW_on_key_in_reference_model3604 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_reference_model3620 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000000L});
    public static final BitSet FOLLOW_subquery_in_reference_model3623 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_reference_model3625 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_model_column_clauses_in_reference_model3628 = new BitSet(new long[]{0x1000000000000002L,0x8000000000000000L});
    public static final BitSet FOLLOW_cell_reference_options_in_reference_model3643 = new BitSet(new long[]{0x1000000000000002L,0x8000000000000000L});
    public static final BitSet FOLLOW_main_key_in_main_model3665 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_main_model_name_in_main_model3667 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_model_column_clauses_in_main_model3671 = new BitSet(new long[]{0x1000000004000000L,0x8000000000000000L});
    public static final BitSet FOLLOW_cell_reference_options_in_main_model3673 = new BitSet(new long[]{0x1000000004000000L,0x8000000000000000L});
    public static final BitSet FOLLOW_model_rules_clause_in_main_model3676 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_model_column_partition_part_in_model_column_clauses3720 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_dimension_key_in_model_column_clauses3731 = new BitSet(new long[]{0x0000000000000000L,0x0000000000002000L});
    public static final BitSet FOLLOW_by_key_in_model_column_clauses3733 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_model_column_list_in_model_column_clauses3735 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_measures_key_in_model_column_clauses3737 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_model_column_list_in_model_column_clauses3739 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_partition_key_in_model_column_partition_part3788 = new BitSet(new long[]{0x0000000000000000L,0x0000000000002000L});
    public static final BitSet FOLLOW_by_key_in_model_column_partition_part3791 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_model_column_list_in_model_column_partition_part3794 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_model_column_list3814 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_model_column_in_model_column_list3816 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_model_column_list3819 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_model_column_in_model_column_list3821 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_model_column_list3826 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_in_model_column3863 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_model_column3865 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_model_rules_part_in_model_rules_clause3910 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_model_rules_clause3913 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000081L});
    public static final BitSet FOLLOW_model_rules_element_in_model_rules_clause3915 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_model_rules_clause3918 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000081L});
    public static final BitSet FOLLOW_model_rules_element_in_model_rules_clause3920 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_model_rules_clause3924 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_rules_key_in_model_rules_part3964 = new BitSet(new long[]{0x1000000000000002L,0x0000000000000000L,0x0000000000000001L});
    public static final BitSet FOLLOW_update_key_in_model_rules_part3967 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_upsert_key_in_model_rules_part3969 = new BitSet(new long[]{0x1000000000000002L,0x0000000000000010L});
    public static final BitSet FOLLOW_all_key_in_model_rules_part3971 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_automatic_key_in_model_rules_part3978 = new BitSet(new long[]{0x0000000000000000L,0x0002000000000000L});
    public static final BitSet FOLLOW_sequential_key_in_model_rules_part3980 = new BitSet(new long[]{0x0000000000000000L,0x0002000000000000L});
    public static final BitSet FOLLOW_order_key_in_model_rules_part3983 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_model_iterate_clause_in_model_rules_part3987 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_update_key_in_model_rules_element4041 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_upsert_key_in_model_rules_element4043 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_all_key_in_model_rules_element4051 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_cell_assignment_in_model_rules_element4065 = new BitSet(new long[]{0x0000000000040000L,0x0002000000000000L});
    public static final BitSet FOLLOW_order_by_clause_in_model_rules_element4083 = new BitSet(new long[]{0x0000000000040000L});
    public static final BitSet FOLLOW_EQUALS_OP_in_model_rules_element4098 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_model_rules_element4100 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_model_expression_in_cell_assignment4159 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_iterate_key_in_model_iterate_clause4179 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_model_iterate_clause4181 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_model_iterate_clause4183 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_model_iterate_clause4185 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_until_part_in_model_iterate_clause4187 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_until_key_in_until_part4230 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_until_part4232 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_condition_in_until_part4234 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_until_part4236 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_order_key_in_order_by_clause4276 = new BitSet(new long[]{0x1000000000000000L,0x0000000000002000L});
    public static final BitSet FOLLOW_siblings_key_in_order_by_clause4278 = new BitSet(new long[]{0x0000000000000000L,0x0000000000002000L});
    public static final BitSet FOLLOW_by_key_in_order_by_clause4281 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_order_by_elements_in_order_by_clause4283 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_COMMA_in_order_by_clause4286 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_order_by_elements_in_order_by_clause4288 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_expression_in_order_by_elements4334 = new BitSet(new long[]{0x1000000000000002L,0x0000000000400200L});
    public static final BitSet FOLLOW_asc_key_in_order_by_elements4337 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_desc_key_in_order_by_elements4339 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_nulls_key_in_order_by_elements4344 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_first_key_in_order_by_elements4347 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_last_key_in_order_by_elements4349 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_for_key_in_for_update_clause4407 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000001L});
    public static final BitSet FOLLOW_update_key_in_for_update_clause4409 = new BitSet(new long[]{0x1010000000000002L,0x0000200000000000L});
    public static final BitSet FOLLOW_for_update_of_part_in_for_update_clause4411 = new BitSet(new long[]{0x1010000000000002L});
    public static final BitSet FOLLOW_for_update_options_in_for_update_clause4414 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_of_key_in_for_update_of_part4455 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_for_update_of_part4458 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_COMMA_in_for_update_of_part4461 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_for_update_of_part4464 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_skip_key_in_for_update_options4486 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_locked_key_in_for_update_options4488 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_nowait_key_in_for_update_options4500 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_wait_key_in_for_update_options4511 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_for_update_options4513 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_update_key_in_update_statement4547 = new BitSet(new long[]{0x1000000005008000L,0x0400000000000000L});
    public static final BitSet FOLLOW_general_table_ref_in_update_statement4550 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_update_set_clause_in_update_statement4560 = new BitSet(new long[]{0x1000000000000002L,0x0000000000000000L,0x0000000000000010L});
    public static final BitSet FOLLOW_where_clause_in_update_statement4570 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_static_returning_clause_in_update_statement4573 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_error_logging_clause_in_update_statement4576 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_set_key_in_update_set_clause4606 = new BitSet(new long[]{0x1000000005008000L});
    public static final BitSet FOLLOW_column_based_update_set_clause_in_update_set_clause4617 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_COMMA_in_update_set_clause4620 = new BitSet(new long[]{0x1000000005008000L});
    public static final BitSet FOLLOW_column_based_update_set_clause_in_update_set_clause4622 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_value_key_in_update_set_clause4637 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_update_set_clause4639 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_id_in_update_set_clause4641 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_update_set_clause4643 = new BitSet(new long[]{0x0000000000040000L});
    public static final BitSet FOLLOW_EQUALS_OP_in_update_set_clause4645 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_update_set_clause4647 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_column_name_in_column_based_update_set_clause4717 = new BitSet(new long[]{0x0000000000040000L});
    public static final BitSet FOLLOW_EQUALS_OP_in_column_based_update_set_clause4719 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_column_based_update_set_clause4721 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_column_based_update_set_clause4747 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_column_based_update_set_clause4749 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_column_based_update_set_clause4752 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_column_based_update_set_clause4754 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_column_based_update_set_clause4758 = new BitSet(new long[]{0x0000000000040000L});
    public static final BitSet FOLLOW_EQUALS_OP_in_column_based_update_set_clause4760 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000000L});
    public static final BitSet FOLLOW_subquery_in_column_based_update_set_clause4762 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_delete_key_in_delete_statement4796 = new BitSet(new long[]{0x1000000005008000L,0x0400000100000000L});
    public static final BitSet FOLLOW_from_key_in_delete_statement4799 = new BitSet(new long[]{0x1000000005008000L,0x0400000000000000L});
    public static final BitSet FOLLOW_general_table_ref_in_delete_statement4811 = new BitSet(new long[]{0x1000000000000002L,0x0000000000000000L,0x0000000000000010L});
    public static final BitSet FOLLOW_where_clause_in_delete_statement4821 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_static_returning_clause_in_delete_statement4824 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_error_logging_clause_in_delete_statement4827 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_insert_key_in_insert_statement4848 = new BitSet(new long[]{0x1000000000000000L,0x0000010000000010L,0x0000000000000008L});
    public static final BitSet FOLLOW_single_table_insert_in_insert_statement4860 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_multi_table_insert_in_insert_statement4871 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_insert_into_clause_in_single_table_insert4899 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000000L,0x0000000000000022L});
    public static final BitSet FOLLOW_values_clause_in_single_table_insert4910 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_static_returning_clause_in_single_table_insert4912 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_select_statement_in_single_table_insert4924 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_error_logging_clause_in_single_table_insert4940 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_all_key_in_multi_table_insert4999 = new BitSet(new long[]{0x0000000000000000L,0x0000010000000000L});
    public static final BitSet FOLLOW_multi_table_element_in_multi_table_insert5001 = new BitSet(new long[]{0x0000000004000000L,0x0080010000000000L,0x0000000000000020L});
    public static final BitSet FOLLOW_conditional_insert_clause_in_multi_table_insert5013 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000000L,0x0000000000000020L});
    public static final BitSet FOLLOW_select_statement_in_multi_table_insert5029 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_insert_into_clause_in_multi_table_element5071 = new BitSet(new long[]{0x1000000000000002L,0x0000000000000000L,0x0000000000000002L});
    public static final BitSet FOLLOW_values_clause_in_multi_table_element5073 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_error_logging_clause_in_multi_table_element5076 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_all_key_in_conditional_insert_clause5120 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000008L});
    public static final BitSet FOLLOW_first_key_in_conditional_insert_clause5122 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000008L});
    public static final BitSet FOLLOW_conditional_insert_when_part_in_conditional_insert_clause5134 = new BitSet(new long[]{0x0000000000000002L,0x0000000002000000L,0x0000000000000008L});
    public static final BitSet FOLLOW_conditional_insert_else_part_in_conditional_insert_clause5137 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_when_key_in_conditional_insert_when_part5185 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_condition_in_conditional_insert_when_part5187 = new BitSet(new long[]{0x0000000000000000L,0x0800000000000000L});
    public static final BitSet FOLLOW_then_key_in_conditional_insert_when_part5189 = new BitSet(new long[]{0x0000000000000000L,0x0000010000000000L});
    public static final BitSet FOLLOW_multi_table_element_in_conditional_insert_when_part5191 = new BitSet(new long[]{0x0000000000000002L,0x0000010000000000L});
    public static final BitSet FOLLOW_else_key_in_conditional_insert_else_part5235 = new BitSet(new long[]{0x0000000000000000L,0x0000010000000000L});
    public static final BitSet FOLLOW_multi_table_element_in_conditional_insert_else_part5238 = new BitSet(new long[]{0x0000000000000002L,0x0000010000000000L});
    public static final BitSet FOLLOW_into_key_in_insert_into_clause5259 = new BitSet(new long[]{0x1000000005008000L,0x0400000000000000L});
    public static final BitSet FOLLOW_general_table_ref_in_insert_into_clause5261 = new BitSet(new long[]{0x0000000004000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_insert_into_clause5273 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_insert_into_clause5275 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_insert_into_clause5278 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_insert_into_clause5280 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_insert_into_clause5284 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_values_key_in_values_clause5329 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_expression_list_in_values_clause5332 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_merge_key_in_merge_statement5353 = new BitSet(new long[]{0x0000000000000000L,0x0000010000000000L});
    public static final BitSet FOLLOW_into_key_in_merge_statement5355 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_tableview_name_in_merge_statement5357 = new BitSet(new long[]{0x1000002001008400L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_merge_statement5359 = new BitSet(new long[]{0x0000002000000000L});
    public static final BitSet FOLLOW_using_key_in_merge_statement5370 = new BitSet(new long[]{0x1000000005008000L,0x0080000000000000L});
    public static final BitSet FOLLOW_selected_tableview_in_merge_statement5372 = new BitSet(new long[]{0x0000000000000000L,0x0000400000000000L});
    public static final BitSet FOLLOW_on_key_in_merge_statement5374 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_merge_statement5376 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_condition_in_merge_statement5378 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_merge_statement5380 = new BitSet(new long[]{0x1000000000000002L,0x0000000000000000L,0x0000000000000008L});
    public static final BitSet FOLLOW_merge_update_clause_in_merge_statement5390 = new BitSet(new long[]{0x1000000000000002L,0x0000000000000000L,0x0000000000000008L});
    public static final BitSet FOLLOW_merge_insert_clause_in_merge_statement5393 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_error_logging_clause_in_merge_statement5396 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_when_key_in_merge_update_clause5476 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_matched_key_in_merge_update_clause5478 = new BitSet(new long[]{0x0000000000000000L,0x0800000000000000L});
    public static final BitSet FOLLOW_then_key_in_merge_update_clause5480 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000001L});
    public static final BitSet FOLLOW_update_key_in_merge_update_clause5482 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_set_key_in_merge_update_clause5484 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_merge_element_in_merge_update_clause5495 = new BitSet(new long[]{0x0000000000001002L,0x0000000000200000L,0x0000000000000010L});
    public static final BitSet FOLLOW_COMMA_in_merge_update_clause5498 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_merge_element_in_merge_update_clause5500 = new BitSet(new long[]{0x0000000000001002L,0x0000000000200000L,0x0000000000000010L});
    public static final BitSet FOLLOW_where_clause_in_merge_update_clause5512 = new BitSet(new long[]{0x0000000000000002L,0x0000000000200000L});
    public static final BitSet FOLLOW_merge_update_delete_part_in_merge_update_clause5515 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_column_name_in_merge_element5558 = new BitSet(new long[]{0x0000000000040000L});
    public static final BitSet FOLLOW_EQUALS_OP_in_merge_element5560 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_merge_element5562 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_delete_key_in_merge_update_delete_part5605 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000010L});
    public static final BitSet FOLLOW_where_clause_in_merge_update_delete_part5608 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_when_key_in_merge_insert_clause5628 = new BitSet(new long[]{0x0000000000000000L,0x0000080000000000L});
    public static final BitSet FOLLOW_not_key_in_merge_insert_clause5630 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_matched_key_in_merge_insert_clause5632 = new BitSet(new long[]{0x0000000000000000L,0x0800000000000000L});
    public static final BitSet FOLLOW_then_key_in_merge_insert_clause5634 = new BitSet(new long[]{0x0000000000000000L,0x0000004000000000L});
    public static final BitSet FOLLOW_insert_key_in_merge_insert_clause5636 = new BitSet(new long[]{0x0000000004000000L,0x0000000000000000L,0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_merge_insert_clause5648 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_merge_insert_clause5650 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_merge_insert_clause5653 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_merge_insert_clause5655 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_merge_insert_clause5659 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000002L});
    public static final BitSet FOLLOW_values_key_in_merge_insert_clause5671 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_expression_list_in_merge_insert_clause5673 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000010L});
    public static final BitSet FOLLOW_where_clause_in_merge_insert_clause5675 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_tableview_name_in_selected_tableview5725 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_subquery_in_selected_tableview5729 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_selected_tableview5733 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_lock_key_in_lock_table_statement5779 = new BitSet(new long[]{0x0000000000000000L,0x0400000000000000L});
    public static final BitSet FOLLOW_table_key_in_lock_table_statement5781 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_lock_table_element_in_lock_table_statement5792 = new BitSet(new long[]{0x0000000000001000L,0x0000002000000000L});
    public static final BitSet FOLLOW_COMMA_in_lock_table_statement5795 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_lock_table_element_in_lock_table_statement5797 = new BitSet(new long[]{0x0000000000001000L,0x0000002000000000L});
    public static final BitSet FOLLOW_in_key_in_lock_table_statement5810 = new BitSet(new long[]{0x1040080000000000L});
    public static final BitSet FOLLOW_lock_mode_in_lock_table_statement5812 = new BitSet(new long[]{0x0004000000000000L});
    public static final BitSet FOLLOW_mode_key_in_lock_table_statement5814 = new BitSet(new long[]{0x1010000000000002L});
    public static final BitSet FOLLOW_wait_nowait_part_in_lock_table_statement5816 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_wait_key_in_wait_nowait_part5859 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_wait_nowait_part5861 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_nowait_key_in_wait_nowait_part5884 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_tableview_name_in_lock_table_element5906 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_partition_extension_clause_in_lock_table_element5908 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_row_key_in_lock_mode5948 = new BitSet(new long[]{0x0040000000000000L});
    public static final BitSet FOLLOW_share_key_in_lock_mode5950 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_row_key_in_lock_mode5961 = new BitSet(new long[]{0x0000080000000000L});
    public static final BitSet FOLLOW_exclusive_key_in_lock_mode5963 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_share_key_in_lock_mode5974 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000001L});
    public static final BitSet FOLLOW_update_key_in_lock_mode5976 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_share_key_in_lock_mode5988 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_row_key_in_lock_mode5990 = new BitSet(new long[]{0x0000080000000000L});
    public static final BitSet FOLLOW_exclusive_key_in_lock_mode5992 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_exclusive_key_in_lock_mode6003 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_dml_table_expression_clause_in_general_table_ref6031 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_only_key_in_general_table_ref6046 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_general_table_ref6048 = new BitSet(new long[]{0x1000000005008000L,0x0400000000000000L});
    public static final BitSet FOLLOW_dml_table_expression_clause_in_general_table_ref6050 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_general_table_ref6052 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_general_table_ref6067 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_returning_key_in_static_returning_clause6111 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_return_key_in_static_returning_clause6113 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_static_returning_clause6116 = new BitSet(new long[]{0x1000000000001000L,0x0000010000000000L});
    public static final BitSet FOLLOW_COMMA_in_static_returning_clause6119 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_static_returning_clause6121 = new BitSet(new long[]{0x1000000000001000L,0x0000010000000000L});
    public static final BitSet FOLLOW_into_clause_in_static_returning_clause6134 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_log_key_in_error_logging_clause6177 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_errors_key_in_error_logging_clause6179 = new BitSet(new long[]{0x1400000025088C22L,0x2008190030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_error_logging_into_part_in_error_logging_clause6190 = new BitSet(new long[]{0x1400000025088C22L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_error_logging_clause6207 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_error_logging_reject_part_in_error_logging_clause6219 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_into_key_in_error_logging_into_part6263 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_tableview_name_in_error_logging_into_part6266 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_reject_key_in_error_logging_reject_part6286 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_limit_key_in_error_logging_reject_part6289 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_unlimited_key_in_error_logging_reject_part6297 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_wrapper_in_error_logging_reject_part6299 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_table_collection_expression_in_dml_table_expression_clause6320 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_dml_table_expression_clause6343 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000000L,0x0000000000000020L});
    public static final BitSet FOLLOW_select_statement_in_dml_table_expression_clause6345 = new BitSet(new long[]{0x4000000000000000L,0x0000000000000000L,0x0000000000000020L});
    public static final BitSet FOLLOW_subquery_restriction_clause_in_dml_table_expression_clause6347 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_dml_table_expression_clause6350 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_tableview_name_in_dml_table_expression_clause6376 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_sample_clause_in_dml_table_expression_clause6378 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_table_key_in_table_collection_expression6414 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_table_collection_expression6424 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_table_collection_expression6426 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_table_collection_expression6428 = new BitSet(new long[]{0x0000000004000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_table_collection_expression6441 = new BitSet(new long[]{0x0400000000000000L});
    public static final BitSet FOLLOW_PLUS_SIGN_in_table_collection_expression6443 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_table_collection_expression6445 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_with_key_in_subquery_restriction_clause6487 = new BitSet(new long[]{0x1000000000000000L,0x0000000000008000L});
    public static final BitSet FOLLOW_read_key_in_subquery_restriction_clause6498 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_only_key_in_subquery_restriction_clause6500 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_check_key_in_subquery_restriction_clause6511 = new BitSet(new long[]{0x0000000000000000L,0x0000800000000000L});
    public static final BitSet FOLLOW_option_key_in_subquery_restriction_clause6513 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_constraint_key_in_subquery_restriction_clause6516 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_constraint_name_in_subquery_restriction_clause6518 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_sample_key_in_sample_clause6569 = new BitSet(new long[]{0x1000000004000000L});
    public static final BitSet FOLLOW_block_key_in_sample_clause6571 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_sample_clause6583 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_sample_clause6585 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_sample_clause6587 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_seed_part_in_sample_clause6597 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_seed_key_in_seed_part6645 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_seed_part6647 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_seed_part6649 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_seed_part6651 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_expression_list6695 = new BitSet(new long[]{0x5400000025089C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_expression_list6697 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_expression_list6701 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_expression_list6703 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_expression_list6707 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_in_condition6749 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_in_condition_wrapper6769 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_logical_and_expression_in_expression6805 = new BitSet(new long[]{0x0000000000000002L,0x0001000000000000L});
    public static final BitSet FOLLOW_or_key_in_expression6809 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_logical_and_expression_in_expression6812 = new BitSet(new long[]{0x0000000000000002L,0x0001000000000000L});
    public static final BitSet FOLLOW_expression_in_expression_wrapper6839 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_negated_expression_in_logical_and_expression6875 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000040L});
    public static final BitSet FOLLOW_and_key_in_logical_and_expression6879 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_negated_expression_in_logical_and_expression6882 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000040L});
    public static final BitSet FOLLOW_not_key_in_negated_expression6905 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_negated_expression_in_negated_expression6908 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_equality_expression_in_negated_expression6919 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_multiset_expression_in_equality_expression6948 = new BitSet(new long[]{0x0000000000000002L,0x0000020000000000L});
    public static final BitSet FOLLOW_is_key_in_equality_expression6964 = new BitSet(new long[]{0x1000000000000000L,0x0000380000000000L});
    public static final BitSet FOLLOW_not_key_in_equality_expression6967 = new BitSet(new long[]{0x1000000000000000L,0x0000300000000000L});
    public static final BitSet FOLLOW_null_key_in_equality_expression6986 = new BitSet(new long[]{0x0000000000000002L,0x0000020000000000L});
    public static final BitSet FOLLOW_nan_key_in_equality_expression7053 = new BitSet(new long[]{0x0000000000000002L,0x0000020000000000L});
    public static final BitSet FOLLOW_present_key_in_equality_expression7120 = new BitSet(new long[]{0x0000000000000002L,0x0000020000000000L});
    public static final BitSet FOLLOW_infinite_key_in_equality_expression7187 = new BitSet(new long[]{0x0000000000000002L,0x0000020000000000L});
    public static final BitSet FOLLOW_a_key_in_equality_expression7254 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_set_key_in_equality_expression7256 = new BitSet(new long[]{0x0000000000000002L,0x0000020000000000L});
    public static final BitSet FOLLOW_empty_key_in_equality_expression7323 = new BitSet(new long[]{0x0000000000000002L,0x0000020000000000L});
    public static final BitSet FOLLOW_of_key_in_equality_expression7390 = new BitSet(new long[]{0x1000000004000000L});
    public static final BitSet FOLLOW_type_key_in_equality_expression7392 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_equality_expression7395 = new BitSet(new long[]{0x1000000000008000L});
    public static final BitSet FOLLOW_type_spec_in_equality_expression7397 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_equality_expression7400 = new BitSet(new long[]{0x1000000000008000L});
    public static final BitSet FOLLOW_type_spec_in_equality_expression7402 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_equality_expression7406 = new BitSet(new long[]{0x0000000000000002L,0x0000020000000000L});
    public static final BitSet FOLLOW_relational_expression_in_multiset_expression7503 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_multiset_type_in_multiset_expression7519 = new BitSet(new long[]{0x1400000025088C20L,0x2008300030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_of_key_in_multiset_expression7521 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_in_multiset_expression7524 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_member_key_in_multiset_type7569 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_submultiset_key_in_multiset_type7580 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_compound_expression_in_relational_expression7600 = new BitSet(new long[]{0x0000000118640002L});
    public static final BitSet FOLLOW_EQUALS_OP_in_relational_expression7610 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_NOT_EQUAL_OP_in_relational_expression7615 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_LESS_THAN_OP_in_relational_expression7620 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_GREATER_THAN_OP_in_relational_expression7625 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_LESS_THAN_OR_EQUALS_OP_in_relational_expression7630 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_GREATER_THAN_OR_EQUALS_OP_in_relational_expression7635 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_compound_expression_in_relational_expression7640 = new BitSet(new long[]{0x0000000118640002L});
    public static final BitSet FOLLOW_concatenation_in_compound_expression7671 = new BitSet(new long[]{0x1000000000000002L,0x00000C2000001000L});
    public static final BitSet FOLLOW_not_key_in_compound_expression7688 = new BitSet(new long[]{0x1000000000000000L,0x0000042000001000L});
    public static final BitSet FOLLOW_in_key_in_compound_expression7708 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_in_elements_in_compound_expression7710 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_between_key_in_compound_expression7781 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_between_elements_in_compound_expression7783 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_like_type_in_compound_expression7854 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_in_compound_expression7856 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_like_escape_part_in_compound_expression7858 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_like_key_in_like_type7967 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_likec_key_in_like_type7978 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_like2_key_in_like_type7989 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_like4_key_in_like_type8000 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_escape_key_in_like_escape_part8020 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_in_like_escape_part8022 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_in_elements8066 = new BitSet(new long[]{0x1400000025088C20L,0x2088100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_subquery_in_in_elements8074 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_in_elements8080 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_in_elements8083 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_in_elements8085 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_in_elements8091 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_concatenation_in_between_elements8144 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000040L});
    public static final BitSet FOLLOW_and_key_in_between_elements8146 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_in_between_elements8150 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_additive_expression_in_concatenation8195 = new BitSet(new long[]{0x0000000000004002L});
    public static final BitSet FOLLOW_CONCATENATION_OP_in_concatenation8198 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_additive_expression_in_concatenation8201 = new BitSet(new long[]{0x0000000000004002L});
    public static final BitSet FOLLOW_concatenation_in_concatenation_wrapper8223 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_multiply_expression_in_additive_expression8259 = new BitSet(new long[]{0x0400000020000002L});
    public static final BitSet FOLLOW_PLUS_SIGN_in_additive_expression8265 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_MINUS_SIGN_in_additive_expression8270 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_multiply_expression_in_additive_expression8275 = new BitSet(new long[]{0x0400000020000002L});
    public static final BitSet FOLLOW_datetime_expression_in_multiply_expression8297 = new BitSet(new long[]{0x0000000000000082L,0x0000000000000004L});
    public static final BitSet FOLLOW_ASTERISK_in_multiply_expression8303 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_SOLIDUS_in_multiply_expression8308 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_datetime_expression_in_multiply_expression8313 = new BitSet(new long[]{0x0000000000000082L,0x0000000000000004L});
    public static final BitSet FOLLOW_model_expression_in_datetime_expression8336 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_at_key_in_datetime_expression8352 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_local_key_in_datetime_expression8355 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_time_key_in_datetime_expression8357 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_zone_key_in_datetime_expression8359 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_datetime_expression8361 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_interval_expression_in_datetime_expression8411 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_day_key_in_interval_expression8461 = new BitSet(new long[]{0x0000000004000000L,0x1000000000000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_interval_expression8467 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_interval_expression8471 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_interval_expression8473 = new BitSet(new long[]{0x0000000000000000L,0x1000000000000000L});
    public static final BitSet FOLLOW_to_key_in_interval_expression8477 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_second_key_in_interval_expression8479 = new BitSet(new long[]{0x0000000004000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_interval_expression8482 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_interval_expression8486 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_interval_expression8488 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_year_key_in_interval_expression8525 = new BitSet(new long[]{0x0000000004000000L,0x1000000000000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_interval_expression8528 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_interval_expression8530 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_interval_expression8532 = new BitSet(new long[]{0x0000000000000000L,0x1000000000000000L});
    public static final BitSet FOLLOW_to_key_in_interval_expression8536 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_month_key_in_interval_expression8538 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_keep_expression_in_model_expression8577 = new BitSet(new long[]{0x0000000002000002L});
    public static final BitSet FOLLOW_LEFT_BRACKET_in_model_expression8594 = new BitSet(new long[]{0x1400000025088C20L,0x20081800B0904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_model_expression_element_in_model_expression8596 = new BitSet(new long[]{0x2000000000000000L});
    public static final BitSet FOLLOW_RIGHT_BRACKET_in_model_expression8598 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_any_key_in_model_expression_element8650 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_condition_wrapper_in_model_expression_element8652 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_COMMA_in_model_expression_element8656 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_any_key_in_model_expression_element8665 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_condition_wrapper_in_model_expression_element8667 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_single_column_for_loop_in_model_expression_element8681 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_COMMA_in_model_expression_element8684 = new BitSet(new long[]{0x0000000000000000L,0x0000000080000000L});
    public static final BitSet FOLLOW_single_column_for_loop_in_model_expression_element8687 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_multi_column_for_loop_in_model_expression_element8700 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_for_key_in_single_column_for_loop8728 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_single_column_for_loop8730 = new BitSet(new long[]{0x0000000000000000L,0x0000042100000000L});
    public static final BitSet FOLLOW_in_key_in_single_column_for_loop8742 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_expression_list_in_single_column_for_loop8744 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_for_like_part_in_single_column_for_loop8757 = new BitSet(new long[]{0x0000000000000000L,0x0000000100000000L});
    public static final BitSet FOLLOW_from_key_in_single_column_for_loop8760 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_single_column_for_loop8764 = new BitSet(new long[]{0x0000000000000000L,0x1000000000000000L});
    public static final BitSet FOLLOW_to_key_in_single_column_for_loop8778 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_single_column_for_loop8782 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_for_increment_decrement_type_in_single_column_for_loop8784 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_single_column_for_loop8788 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_like_key_in_for_like_part8897 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_for_like_part8899 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_increment_key_in_for_increment_decrement_type8939 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_decrement_key_in_for_increment_decrement_type8950 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_for_key_in_multi_column_for_loop8970 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_multi_column_for_loop8972 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_multi_column_for_loop8974 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_multi_column_for_loop8977 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_multi_column_for_loop8979 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_multi_column_for_loop8983 = new BitSet(new long[]{0x0000000000000000L,0x0000002000000000L});
    public static final BitSet FOLLOW_in_key_in_multi_column_for_loop8985 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_multi_column_for_loop8995 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000000L});
    public static final BitSet FOLLOW_subquery_in_multi_column_for_loop9019 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_multi_column_for_loop9043 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_expression_list_in_multi_column_for_loop9045 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_multi_column_for_loop9048 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_expression_list_in_multi_column_for_loop9050 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_multi_column_for_loop9054 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_multi_column_for_loop9078 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_unary_expression_in_keep_expression9126 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_keep_key_in_keep_expression9137 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_keep_expression9149 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_dense_rank_key_in_keep_expression9165 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_first_key_in_keep_expression9168 = new BitSet(new long[]{0x0000000000000000L,0x0002000000000000L});
    public static final BitSet FOLLOW_last_key_in_keep_expression9170 = new BitSet(new long[]{0x0000000000000000L,0x0002000000000000L});
    public static final BitSet FOLLOW_order_by_clause_in_keep_expression9186 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_keep_expression9196 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_over_clause_in_keep_expression9199 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_MINUS_SIGN_in_unary_expression9226 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_unary_expression_in_unary_expression9228 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_PLUS_SIGN_in_unary_expression9248 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_unary_expression_in_unary_expression9250 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_prior_key_in_unary_expression9270 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_unary_expression_in_unary_expression9273 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_new_key_in_unary_expression9287 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_unary_expression_in_unary_expression9290 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_distinct_key_in_unary_expression9301 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_unary_expression_in_unary_expression9304 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_all_key_in_unary_expression9315 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_unary_expression_in_unary_expression9318 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_case_statement_in_unary_expression9331 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_quantified_expression_in_unary_expression9343 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_standard_function_in_unary_expression9354 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_atom_in_unary_expression9373 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_searched_case_statement_in_case_statement9420 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_simple_case_statement_in_case_statement9431 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_label_name_in_simple_case_statement9453 = new BitSet(new long[]{0x0000000000000000L,0x0000000000004000L});
    public static final BitSet FOLLOW_case_key_in_simple_case_statement9458 = new BitSet(new long[]{0x1000000005088C20L,0x2000100020100000L,0x0000000000000080L});
    public static final BitSet FOLLOW_atom_in_simple_case_statement9460 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000008L});
    public static final BitSet FOLLOW_simple_case_when_part_in_simple_case_statement9470 = new BitSet(new long[]{0x0000000000000000L,0x0000000006000000L,0x0000000000000008L});
    public static final BitSet FOLLOW_case_else_part_in_simple_case_statement9482 = new BitSet(new long[]{0x0000000000000000L,0x0000000004000000L});
    public static final BitSet FOLLOW_end_key_in_simple_case_statement9493 = new BitSet(new long[]{0x1000000000008002L,0x0000000000004000L});
    public static final BitSet FOLLOW_case_key_in_simple_case_statement9495 = new BitSet(new long[]{0x1000000000008002L});
    public static final BitSet FOLLOW_label_name_in_simple_case_statement9498 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_when_key_in_simple_case_when_part9551 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_simple_case_when_part9556 = new BitSet(new long[]{0x0000000000000000L,0x0800000000000000L});
    public static final BitSet FOLLOW_then_key_in_simple_case_when_part9558 = new BitSet(new long[]{0x1401000025088C20L,0x2088184030B04090L,0x00000000000000A1L});
    public static final BitSet FOLLOW_seq_of_statements_in_simple_case_when_part9564 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_wrapper_in_simple_case_when_part9570 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_label_name_in_searched_case_statement9591 = new BitSet(new long[]{0x0000000000000000L,0x0000000000004000L});
    public static final BitSet FOLLOW_case_key_in_searched_case_statement9596 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000008L});
    public static final BitSet FOLLOW_searched_case_when_part_in_searched_case_statement9606 = new BitSet(new long[]{0x0000000000000000L,0x0000000006000000L,0x0000000000000008L});
    public static final BitSet FOLLOW_case_else_part_in_searched_case_statement9617 = new BitSet(new long[]{0x0000000000000000L,0x0000000004000000L});
    public static final BitSet FOLLOW_end_key_in_searched_case_statement9628 = new BitSet(new long[]{0x1000000000008002L,0x0000000000004000L});
    public static final BitSet FOLLOW_case_key_in_searched_case_statement9630 = new BitSet(new long[]{0x1000000000008002L});
    public static final BitSet FOLLOW_label_name_in_searched_case_statement9633 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_when_key_in_searched_case_when_part9679 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_condition_wrapper_in_searched_case_when_part9682 = new BitSet(new long[]{0x0000000000000000L,0x0800000000000000L});
    public static final BitSet FOLLOW_then_key_in_searched_case_when_part9684 = new BitSet(new long[]{0x1401000025088C20L,0x2088184030B04090L,0x00000000000000A1L});
    public static final BitSet FOLLOW_seq_of_statements_in_searched_case_when_part9690 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_wrapper_in_searched_case_when_part9694 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_else_key_in_case_else_part9715 = new BitSet(new long[]{0x1401000025088C20L,0x2088184030B04090L,0x00000000000000A1L});
    public static final BitSet FOLLOW_seq_of_statements_in_case_else_part9721 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_wrapper_in_case_else_part9725 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_constant_in_atom9747 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_general_element_in_atom9758 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_atom9769 = new BitSet(new long[]{0x1400000025088C20L,0x2088180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_subquery_in_atom9778 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_expression_or_vector_in_atom9780 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_atom9783 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_in_expression_or_vector9812 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_vector_expr_in_expression_or_vector9815 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_COMMA_in_vector_expr9875 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_vector_expr9877 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_COMMA_in_vector_expr9880 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_in_vector_expr9882 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_some_key_in_quantified_expression9923 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_exists_key_in_quantified_expression9928 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_all_key_in_quantified_expression9933 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_any_key_in_quantified_expression9938 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_quantified_expression9952 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_quantified_expression9955 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_quantified_expression9957 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_stantard_function_enabling_over_in_standard_function9978 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_function_argument_in_standard_function9981 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_over_clause_in_standard_function9983 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_stantard_function_enabling_using_in_standard_function9995 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_function_argument_in_standard_function9998 = new BitSet(new long[]{0x0000002000000002L});
    public static final BitSet FOLLOW_using_clause_in_standard_function10000 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_count_key_in_standard_function10012 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10027 = new BitSet(new long[]{0x1400000025088CA0L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_ASTERISK_in_standard_function10048 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function10052 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function10069 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_over_clause_in_standard_function10072 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_cast_key_in_standard_function10085 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_xmlcast_key_in_standard_function10088 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10105 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_multiset_key_in_standard_function10125 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10128 = new BitSet(new long[]{0x0000000004000000L,0x0080000000000000L});
    public static final BitSet FOLLOW_subquery_in_standard_function10131 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function10133 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000100L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function10135 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000100L});
    public static final BitSet FOLLOW_as_key_in_standard_function10138 = new BitSet(new long[]{0x1000000000008000L});
    public static final BitSet FOLLOW_type_spec_in_standard_function10141 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function10156 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_chr_key_in_standard_function10168 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10183 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function10203 = new BitSet(new long[]{0x0000002000000000L});
    public static final BitSet FOLLOW_using_key_in_standard_function10205 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_nchar_cs_key_in_standard_function10208 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function10223 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_collect_key_in_standard_function10235 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10250 = new BitSet(new long[]{0x1000000001008000L,0x8000000000800000L});
    public static final BitSet FOLLOW_distinct_key_in_standard_function10271 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_unique_key_in_standard_function10273 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_column_name_in_standard_function10277 = new BitSet(new long[]{0x4000000000000000L,0x0002000000000000L});
    public static final BitSet FOLLOW_collect_order_by_part_in_standard_function10279 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function10294 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_stantard_function_enabling_within_or_over_in_standard_function10306 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_function_argument_in_standard_function10322 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_within_or_over_part_in_standard_function10324 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_decompose_key_in_standard_function10336 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10351 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function10371 = new BitSet(new long[]{0x5000000000000000L});
    public static final BitSet FOLLOW_canonical_key_in_standard_function10374 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_compatibility_key_in_standard_function10376 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function10393 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_extract_key_in_standard_function10405 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10420 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_REGULAR_ID_in_standard_function10439 = new BitSet(new long[]{0x0000000000000000L,0x0000000100000000L});
    public static final BitSet FOLLOW_from_key_in_standard_function10441 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function10444 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function10459 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_first_value_key_in_standard_function10472 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_last_value_key_in_standard_function10475 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10492 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function10511 = new BitSet(new long[]{0x5000000000000000L});
    public static final BitSet FOLLOW_ignore_key_in_standard_function10514 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_nulls_key_in_standard_function10517 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function10534 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_over_clause_in_standard_function10537 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_stantard_function_pedictions_in_standard_function10548 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10563 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_standard_function10582 = new BitSet(new long[]{0x5000002000001000L});
    public static final BitSet FOLLOW_COMMA_in_standard_function10585 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_standard_function10587 = new BitSet(new long[]{0x5000002000001000L});
    public static final BitSet FOLLOW_cost_matrix_clause_in_standard_function10591 = new BitSet(new long[]{0x4000002000000000L});
    public static final BitSet FOLLOW_using_clause_in_standard_function10594 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function10610 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_translate_key_in_standard_function10622 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10637 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_standard_function10657 = new BitSet(new long[]{0x4000002000001000L});
    public static final BitSet FOLLOW_using_key_in_standard_function10660 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_char_cs_key_in_standard_function10664 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_nchar_cs_key_in_standard_function10666 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_standard_function10693 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_standard_function10695 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function10712 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_treat_key_in_standard_function10724 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10739 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_standard_function10758 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000100L});
    public static final BitSet FOLLOW_as_key_in_standard_function10760 = new BitSet(new long[]{0x1000000000008000L});
    public static final BitSet FOLLOW_ref_key_in_standard_function10763 = new BitSet(new long[]{0x1000000000008000L});
    public static final BitSet FOLLOW_type_spec_in_standard_function10766 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function10781 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_trim_key_in_standard_function10793 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10808 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_leading_key_in_standard_function10830 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_trailing_key_in_standard_function10832 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_both_key_in_standard_function10834 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function10838 = new BitSet(new long[]{0x0000000000000000L,0x0000000100000000L});
    public static final BitSet FOLLOW_from_key_in_standard_function10840 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function10845 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function10860 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_xmlagg_key_in_standard_function10872 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10887 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_standard_function10907 = new BitSet(new long[]{0x4000000000000000L,0x0002000000000000L});
    public static final BitSet FOLLOW_order_by_clause_in_standard_function10909 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function10925 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_xmlcolattval_key_in_standard_function10938 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_xmlforest_key_in_standard_function10941 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function10958 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_xml_multiuse_expression_element_in_standard_function10977 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_standard_function10980 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_xml_multiuse_expression_element_in_standard_function10983 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function10999 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_xmlelement_key_in_standard_function11011 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function11026 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_entityescaping_key_in_standard_function11046 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_noentityescaping_key_in_standard_function11048 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_name_key_in_standard_function11069 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_evalname_key_in_standard_function11071 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_standard_function11075 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_standard_function11096 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_xml_attributes_clause_in_standard_function11099 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_standard_function11120 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_standard_function11123 = new BitSet(new long[]{0x5000000001009400L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_standard_function11125 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function11142 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_xmlexists_key_in_standard_function11154 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function11169 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_standard_function11188 = new BitSet(new long[]{0x5000000000000000L});
    public static final BitSet FOLLOW_xml_passing_clause_in_standard_function11206 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function11221 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_xmlparse_key_in_standard_function11233 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function11248 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_document_key_in_standard_function11269 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_content_key_in_standard_function11271 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function11274 = new BitSet(new long[]{0x5000000000000000L});
    public static final BitSet FOLLOW_wellformed_key_in_standard_function11276 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function11291 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_xmlpi_key_in_standard_function11303 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function11318 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_name_key_in_standard_function11343 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_id_in_standard_function11345 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_evalname_key_in_standard_function11368 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function11370 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_standard_function11407 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function11410 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function11426 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_xmlquery_key_in_standard_function11438 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function11453 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function11473 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_xml_passing_clause_in_standard_function11475 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_returning_key_in_standard_function11494 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_content_key_in_standard_function11497 = new BitSet(new long[]{0x4000000000000000L,0x0000100000000000L});
    public static final BitSet FOLLOW_null_key_in_standard_function11501 = new BitSet(new long[]{0x0000000000000000L,0x0000400000000000L});
    public static final BitSet FOLLOW_on_key_in_standard_function11503 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_empty_key_in_standard_function11506 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function11523 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_xmlroot_key_in_standard_function11535 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function11550 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function11569 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_xmlroot_param_version_part_in_standard_function11591 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_standard_function11614 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_xmlroot_param_standalone_part_in_standard_function11617 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function11633 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_xmlserialize_key_in_standard_function11645 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function11660 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_document_key_in_standard_function11680 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_content_key_in_standard_function11682 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function11701 = new BitSet(new long[]{0x5000000000000000L,0x0000000000000100L});
    public static final BitSet FOLLOW_as_key_in_standard_function11704 = new BitSet(new long[]{0x1000000000008000L});
    public static final BitSet FOLLOW_type_spec_in_standard_function11707 = new BitSet(new long[]{0x5000000000000000L});
    public static final BitSet FOLLOW_xmlserialize_param_enconding_part_in_standard_function11727 = new BitSet(new long[]{0x5000000000000000L});
    public static final BitSet FOLLOW_xmlserialize_param_version_part_in_standard_function11746 = new BitSet(new long[]{0x5000000000000000L});
    public static final BitSet FOLLOW_xmlserialize_param_ident_part_in_standard_function11765 = new BitSet(new long[]{0x5000000000000000L});
    public static final BitSet FOLLOW_hide_key_in_standard_function11786 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_show_key_in_standard_function11788 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_defaults_key_in_standard_function11791 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function11807 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_xmltable_key_in_standard_function11819 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_standard_function11834 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_xml_namespaces_clause_in_standard_function11853 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_standard_function11872 = new BitSet(new long[]{0x5000010000000000L});
    public static final BitSet FOLLOW_xml_passing_clause_in_standard_function11890 = new BitSet(new long[]{0x4000010000000000L});
    public static final BitSet FOLLOW_columns_key_in_standard_function11910 = new BitSet(new long[]{0x1000000001008400L});
    public static final BitSet FOLLOW_xml_table_column_in_standard_function11913 = new BitSet(new long[]{0x0000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_standard_function11916 = new BitSet(new long[]{0x1000000001008400L});
    public static final BitSet FOLLOW_xml_table_column_in_standard_function11919 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_standard_function11936 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_REGULAR_ID_in_stantard_function_enabling_over11960 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_REGULAR_ID_in_stantard_function_enabling_using11988 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_REGULAR_ID_in_stantard_function_enabling_within_or_over12016 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_REGULAR_ID_in_stantard_function_pedictions12044 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_over_key_in_over_clause12069 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_over_clause12080 = new BitSet(new long[]{0x5000000000000000L,0x0002000000000000L});
    public static final BitSet FOLLOW_query_partition_clause_in_over_clause12095 = new BitSet(new long[]{0x4000000000000000L,0x0002000000000000L});
    public static final BitSet FOLLOW_order_by_clause_in_over_clause12111 = new BitSet(new long[]{0x5000000000000000L});
    public static final BitSet FOLLOW_windowing_clause_in_over_clause12113 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_over_clause12126 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_windowing_type_in_windowing_clause12155 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030945090L,0x0000000000000080L});
    public static final BitSet FOLLOW_between_key_in_windowing_clause12166 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030944090L,0x0000000000000080L});
    public static final BitSet FOLLOW_windowing_elements_in_windowing_clause12168 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000040L});
    public static final BitSet FOLLOW_and_key_in_windowing_clause12170 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030944090L,0x0000000000000080L});
    public static final BitSet FOLLOW_windowing_elements_in_windowing_clause12172 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_windowing_elements_in_windowing_clause12185 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_rows_key_in_windowing_type12244 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_range_key_in_windowing_type12255 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_unbounded_key_in_windowing_elements12275 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_preceding_key_in_windowing_elements12278 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_current_key_in_windowing_elements12289 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_row_key_in_windowing_elements12292 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_windowing_elements12303 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_preceding_key_in_windowing_elements12306 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_following_key_in_windowing_elements12309 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_using_key_in_using_clause12331 = new BitSet(new long[]{0x1400000025088CA0L,0x2008182030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_ASTERISK_in_using_clause12343 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_using_element_in_using_clause12354 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_COMMA_in_using_clause12357 = new BitSet(new long[]{0x1400000025088C20L,0x2008182030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_using_element_in_using_clause12360 = new BitSet(new long[]{0x0000000000001002L});
    public static final BitSet FOLLOW_in_key_in_using_element12389 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_out_key_in_using_element12391 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_out_key_in_using_element12394 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_select_list_elements_in_using_element12398 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_using_element12400 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_order_key_in_collect_order_by_part12446 = new BitSet(new long[]{0x0000000000000000L,0x0000000000002000L});
    public static final BitSet FOLLOW_by_key_in_collect_order_by_part12449 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_collect_order_by_part12452 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_within_key_in_within_or_over_part12472 = new BitSet(new long[]{0x0000000000000000L,0x0000000800000000L});
    public static final BitSet FOLLOW_group_key_in_within_or_over_part12475 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_within_or_over_part12478 = new BitSet(new long[]{0x0000000000000000L,0x0002000000000000L});
    public static final BitSet FOLLOW_order_by_clause_in_within_or_over_part12481 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_within_or_over_part12483 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_over_clause_in_within_or_over_part12495 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_cost_key_in_cost_matrix_clause12515 = new BitSet(new long[]{0x0000001004000000L});
    public static final BitSet FOLLOW_model_key_in_cost_matrix_clause12527 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_auto_key_in_cost_matrix_clause12529 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_cost_matrix_clause12541 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_cost_class_name_in_cost_matrix_clause12544 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_cost_matrix_clause12547 = new BitSet(new long[]{0x1000000001008000L});
    public static final BitSet FOLLOW_cost_class_name_in_cost_matrix_clause12550 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_cost_matrix_clause12554 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000002L});
    public static final BitSet FOLLOW_values_key_in_cost_matrix_clause12557 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_expression_list_in_cost_matrix_clause12573 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_passing_key_in_xml_passing_clause12599 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030906090L,0x0000000000000080L});
    public static final BitSet FOLLOW_by_key_in_xml_passing_clause12603 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_value_key_in_xml_passing_clause12606 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_xml_passing_clause12622 = new BitSet(new long[]{0x1000000001009400L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_xml_passing_clause12624 = new BitSet(new long[]{0x0000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_xml_passing_clause12628 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_expression_wrapper_in_xml_passing_clause12631 = new BitSet(new long[]{0x1000000001008402L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_xml_passing_clause12633 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_xmlattributes_key_in_xml_attributes_clause12655 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_xml_attributes_clause12666 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_entityescaping_key_in_xml_attributes_clause12682 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_noentityescaping_key_in_xml_attributes_clause12684 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_schemacheck_key_in_xml_attributes_clause12701 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_noschemacheck_key_in_xml_attributes_clause12703 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_xml_multiuse_expression_element_in_xml_attributes_clause12719 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_COMMA_in_xml_attributes_clause12722 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_xml_multiuse_expression_element_in_xml_attributes_clause12725 = new BitSet(new long[]{0x4000000000001000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_xml_attributes_clause12737 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_xmlnamespaces_key_in_xml_namespaces_clause12758 = new BitSet(new long[]{0x0000000004000000L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_xml_namespaces_clause12769 = new BitSet(new long[]{0x5400000025089C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_xml_namespaces_clause12785 = new BitSet(new long[]{0x1000000001008400L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_xml_namespaces_clause12787 = new BitSet(new long[]{0x4000000000001000L,0x0000000000100000L});
    public static final BitSet FOLLOW_COMMA_in_xml_namespaces_clause12809 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_xml_namespaces_clause12812 = new BitSet(new long[]{0x1000000001008400L,0x0000000000000100L});
    public static final BitSet FOLLOW_alias_in_xml_namespaces_clause12814 = new BitSet(new long[]{0x4000000000001000L,0x0000000000100000L});
    public static final BitSet FOLLOW_xml_general_default_part_in_xml_namespaces_clause12836 = new BitSet(new long[]{0x4000000000000000L});
    public static final BitSet FOLLOW_RIGHT_PAREN_in_xml_namespaces_clause12848 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_xml_column_name_in_xml_table_column12869 = new BitSet(new long[]{0x1000000000008000L,0x0000000080000000L});
    public static final BitSet FOLLOW_for_key_in_xml_table_column12880 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_ordinality_key_in_xml_table_column12882 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_type_spec_in_xml_table_column12893 = new BitSet(new long[]{0x1000000000000002L,0x0000000000100000L});
    public static final BitSet FOLLOW_path_key_in_xml_table_column12896 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_xml_table_column12898 = new BitSet(new long[]{0x0000000000000002L,0x0000000000100000L});
    public static final BitSet FOLLOW_xml_general_default_part_in_xml_table_column12908 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_default_key_in_xml_general_default_part12964 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_xml_general_default_part12967 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_in_xml_multiuse_expression_element12995 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000100L});
    public static final BitSet FOLLOW_as_key_in_xml_multiuse_expression_element12998 = new BitSet(new long[]{0x1000000000008000L});
    public static final BitSet FOLLOW_id_expression_in_xml_multiuse_expression_element13001 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_evalname_key_in_xml_multiuse_expression_element13005 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_in_xml_multiuse_expression_element13007 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_version_key_in_xmlroot_param_version_part13118 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_no_key_in_xmlroot_param_version_part13122 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_value_key_in_xmlroot_param_version_part13124 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expression_wrapper_in_xmlroot_param_version_part13126 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_standalone_key_in_xmlroot_param_standalone_part13147 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_yes_key_in_xmlroot_param_standalone_part13151 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_no_key_in_xmlroot_param_standalone_part13153 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_value_key_in_xmlroot_param_standalone_part13155 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_encoding_key_in_xmlserialize_param_enconding_part13177 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_xmlserialize_param_enconding_part13180 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_version_key_in_xmlserialize_param_version_part13200 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_xmlserialize_param_version_part13203 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_no_key_in_xmlserialize_param_ident_part13223 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_indent_key_in_xmlserialize_param_ident_part13225 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_indent_key_in_xmlserialize_param_ident_part13236 = new BitSet(new long[]{0x0000000000000002L,0x0100000000000000L});
    public static final BitSet FOLLOW_size_key_in_xmlserialize_param_ident_part13240 = new BitSet(new long[]{0x0000000000040000L});
    public static final BitSet FOLLOW_EQUALS_OP_in_xmlserialize_param_ident_part13243 = new BitSet(new long[]{0x1400000025088C20L,0x2008100030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_concatenation_wrapper_in_xmlserialize_param_ident_part13246 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_order_key_in_synpred1_PLSQL_DMLParser714 = new BitSet(new long[]{0x1000000000000000L,0x0000000000002000L});
    public static final BitSet FOLLOW_siblings_key_in_synpred1_PLSQL_DMLParser716 = new BitSet(new long[]{0x0000000000000000L,0x0000000000002000L});
    public static final BitSet FOLLOW_by_key_in_synpred1_PLSQL_DMLParser719 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_distinct_key_in_synpred2_PLSQL_DMLParser983 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_unique_key_in_synpred2_PLSQL_DMLParser985 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_all_key_in_synpred2_PLSQL_DMLParser987 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_tableview_name_in_synpred3_PLSQL_DMLParser1320 = new BitSet(new long[]{0x0000000400000000L});
    public static final BitSet FOLLOW_PERIOD_in_synpred3_PLSQL_DMLParser1322 = new BitSet(new long[]{0x0000000000000080L});
    public static final BitSet FOLLOW_ASTERISK_in_synpred3_PLSQL_DMLParser1324 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_synpred4_PLSQL_DMLParser1867 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_select_key_in_synpred5_PLSQL_DMLParser2330 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_any_key_in_synpred6_PLSQL_DMLParser2356 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_synpred7_PLSQL_DMLParser2561 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_synpred8_PLSQL_DMLParser2931 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_COMMA_in_synpred9_PLSQL_DMLParser3149 = new BitSet(new long[]{0x1400000025088C20L,0x2008180030904090L,0x0000000000000080L});
    public static final BitSet FOLLOW_group_by_elements_in_synpred9_PLSQL_DMLParser3151 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_rollup_key_in_synpred10_PLSQL_DMLParser3360 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_cube_key_in_synpred10_PLSQL_DMLParser3362 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_synpred11_PLSQL_DMLParser3378 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_all_key_in_synpred12_PLSQL_DMLParser4047 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_synpred13_PLSQL_DMLParser6203 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_unlimited_key_in_synpred14_PLSQL_DMLParser6294 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_select_key_in_synpred15_PLSQL_DMLParser8070 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_interval_expression_in_synpred16_PLSQL_DMLParser8407 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_any_key_in_synpred17_PLSQL_DMLParser8646 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_any_key_in_synpred18_PLSQL_DMLParser8661 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_select_key_in_synpred19_PLSQL_DMLParser9015 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_LEFT_PAREN_in_synpred20_PLSQL_DMLParser9039 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_label_name_in_synpred21_PLSQL_DMLParser9411 = new BitSet(new long[]{0x0000000000000000L,0x0000000000004000L});
    public static final BitSet FOLLOW_case_key_in_synpred21_PLSQL_DMLParser9414 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000008L});
    public static final BitSet FOLLOW_when_key_in_synpred21_PLSQL_DMLParser9416 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_select_key_in_synpred22_PLSQL_DMLParser9774 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_default_key_in_synpred23_PLSQL_DMLParser12832 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_default_key_in_synpred24_PLSQL_DMLParser12904 = new BitSet(new long[]{0x0000000000000002L});

}